强制 tcsh 在尝试执行命令之前检查命令是否存在于路径中

强制 tcsh 在尝试执行命令之前检查命令是否存在于路径中

我注意到,无论 shebang 行上是否传递了“-f”标志,tcsh 都会迭代 $PATH,并尝试从该路径执行命令,直到找到命令。而 bash 首先检查该命令是否存在于该位置。

这种 tcsh 行为会导致审核日志中出现大量失败条目,因为我们的审核已配置为捕获 execve 系统调用。例如,当从 tcsh 脚本中调用 sleep 时,失败的审核条目之一显示它尝试使用绝对路径运行 sleep:“/usr/local/bin/sleep”。

type=SYSCALL msg=audit(1710330471.326:37838): arch=c000003e syscall=59 success=no exit=-2 a0=2601590 a1=261e010 a2=261d110 a3=7ffdc4a409e0 items=1 ppid=8930 pid=8938 auid=1011478343 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=863 comm="csh_test.sh" exe="/usr/bin/tcsh" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="non_sys_execs"

type=CWD msg=audit(1710330471.326:37838): cwd="/tmp"

type=PATH msg=audit(1710330471.326:37838): item=0name="/usr/local/bin/sleep"objtype=UNKNOWN cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0

type=PROCTITLE msg=audit(1710330471.326:37838): proctitle=2F62696E2F637368002E2F6373685F746573742E7368

在尝试访问之前,Strace 首先显示 bash 统计信息:

stat("/usr/local/bin/sleep", 0x7ffdd8de5630) = -1 ENOENT (No such file or directory)
stat("/usr/local/sbin/sleep", 0x7ffdd8de5630) = -1 ENOENT (No such file or directory)
stat("/sbin/sleep", 0x7ffdd8de5630)     = -1 ENOENT (No such file or directory)
stat("/bin/sleep", {st_mode=S_IFREG|0755, st_size=33128, ...}) = 0

它遍历路径的顺序与 $PATH 中定义路径的顺序相匹配。

不幸的是,改变我们所有服务器上的顺序是不可能的,也不清楚将 /bin/ 放在 /usr/local/bin 等之前会产生什么影响。虽然,我对此表示怀疑,但以防万一,是否有也许某些运行时或安装配置会强制 tcsh 首先进行统计,就像 bash 一样?

还有什么其他方法可以避免这些失败吗(除了修改脚本以使用完整路径或从审计捕获中过滤掉这些 execve 调用)?

答案1

诀窍是强制 tcsh 启用命令散列,事实证明,如果使用“-f”标志调用 get,它就会被禁用,这就是我有问题的脚本中的情况。

在我刚刚添加的脚本顶部:

rehash 4096

答案见:在 tcsh 中启用命令哈希,有关 tcsh 中命令散列的非常详细的描述。

相关内容