/usr/bin/ls: /usr/bin/ls: 无法执行二进制文件

/usr/bin/ls: /usr/bin/ls: 无法执行二进制文件

git bash在 Windows 上使用。我想ls用 运行命令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 选项均未提供,假定第一个参数是文件名包含 shell 命令。

是否ls包含 shell 命令?不,它是一个二进制文件。bash抱怨这个事实并失败了。

Astrace可能有助于显示发生了什么:

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

相关内容