我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
查找(如果有人在某处放置了顽皮的文件,则会存在安全风险!)然后进行搜索: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 /
$