git bash
を使用しています Windowsの場合。 ls
を実行したい bash
を使用したコマンド 。 ls
を実行できます 個別にこのように:
$ ls
f1 f2
ただし、bash
を試してみると 、エラーが発生します:
$ bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
ただし、スクリプトを作成すると正常に機能します:
$ echo "echo [email protected]" > my.sh && bash my.sh
何が問題になる可能性がありますか?
承認された回答:
bash(1)
の詳細なマニュアルから :
引数
オプション処理後に引数が残り、-cオプションも
-sオプションも指定されていない場合、最初の引数は
ファイルの名前であると見なされます シェルコマンドを含みます。
ls
を実行しますか シェルコマンドが含まれていますか?いいえ、バイナリファイルです。 bash
この事実について口論して失敗します。
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 /
$