私はgit bash
Windowsでそれを使用しています。ls
runコマンドを使用したいですbash
。次のように個別に実行できますls
。
$ ls
f1 f2
ただし、使用しようとすると、次bash
のエラーが発生します。
$ bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
しかし、スクリプトを生成すると正常に動作します。
$ echo "echo \$@" > my.sh && bash my.sh
何が問題なのでしょうか?
答え1
美しいマニュアルでbash(1)
:
パラメーター・オプションの処理後もパラメーターが持続し、-c または -s オプションの両方が指定されていない場合、最初のパラメーターがファイル名であるとします。シェルコマンドが含まれています。
ls
シェルコマンドが含まれていますか?いいえ、バイナリファイルです。bash
この事実について文句を言って失敗しました。
Aは、strace
何が起こっているのかを示すのに役立ちます。
$ strace -o alog bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
ファイルalog
は多少混乱する可能性がありますが、ディスプレイは現在の作業ディレクトリを調べてbash
(誰かが奇妙なファイルをどこかに置くとセキュリティ上のリスクが発生します!)、次のように検索します。ls
ls
PATH
$ grep ls alog
execve("/usr/bin/bash", ["bash", "ls"], [/* 43 vars */]) = 0
open("ls", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/ls", 0x7fff349810f0) = -1 ENOENT (No such file or directory)
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", X_OK) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", R_OK) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", X_OK) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", R_OK) = 0
open("/usr/bin/ls", O_RDONLY) = 3
これがセキュリティリスクになる可能性があるのは、bash somecmd
誰かが作成した間違ったディレクトリls
(またはスクリプトのバグが原因で知られている他のコマンド)で実行されている場合です。
$ echo "echo rm -rf /" > ls
$ bash ls
rm -rf /
$