コマンドを実行する前に、tcshにパスにコマンドがあることを確認するように強制します。

コマンドを実行する前に、tcshにパスにコマンドがあることを確認するように強制します。

Shebang行に "-f"フラグが渡されるかどうかにかかわらず、tcshは$ PATHを繰り返し、コマンドが見つかるまでそのパスでコマンドを実行しようとしました。一方、bashは最初にその場所にコマンドがあることを確認します。

この tcsh 動作により、監査ログに失敗したエントリが多数発生します。これは、監査がexecveシステムコールをキャプチャするように構成されているためです。たとえば、tcshスクリプトでスリープを呼び出すときに失敗した監査エントリの1つは、絶対パス「/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で定義されている順序と一致します。

残念ながら、すべてのサーバーで順序を変更することはできません。しかし、あなたがbashのように、tcshが最初に統計を実行するように強制するランタイムまたはインストール構成があるかどうか疑問です。

これらの失敗を防ぐための別の方法があります(フルパスを使用するようにスクリプトを変更したり、監査キャプチャでこれらのexecve呼び出しをフィルタリングすることを除く)。

答え1

秘密は、tcshがコマンドハッシュを有効にすることを強制することでした。 getが "-f"フラグで呼び出されると無効になることがわかりました。問題のあるスクリプトの場合です。

追加したばかりのスクリプトの上部に以下を追加しました。

rehash 4096

答えを見る:tcshでコマンドハッシュを有効にする、tcshのコマンドハッシュの非常に詳細な説明です。

関連情報