/usr/bin/ls: /usr/bin/ls: バイナリファイルを実行できません。

/usr/bin/ls: /usr/bin/ls: バイナリファイルを実行できません。

私はgit bashWindowsでそれを使用しています。lsrunコマンドを使用したいです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(誰かが奇妙なファイルをどこかに置くとセキュリティ上のリスクが発生します!)、次のように検索します。lslsPATH

$ 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 /
$ 

おすすめ記事