【问题标题】:Why do sh, zsh, and bash return zero when executing a zero byte file?为什么 sh、zsh 和 bash 在执行零字节文件时返回零?
【发布时间】:2019-11-03 20:04:28
【问题描述】:

为什么你可以在 bash、zsh 或 sh 中执行一个空文件,当一个带有空文件的 execve 系统调用退出 ENOEXEC 时,它会退出代码 0?

touch zero
chmod +x zero
./zero
echo $?
0

execve 退出 -1 和 ENOEXEC Exec format error,因此这不是操作系统行为。

strace -f ./zero
execve("./zero", ["./zero"], [/* 53 vars */]) = -1 ENOEXEC (Exec format error)
write(2, "strace: exec: Exec format error\n", 32strace: exec: Exec format error
) = 32
exit_group(1)                           = ?
+++ exited with 1 +++

sh 也调用 execve 并获取 -ENOEXEC 但它继续读取文件的 80 个字节并退出零。

strace -f sh -c "./zero"
...
execve("./zero", ["./zero"], [/* 52 vars */]) = -1 ENOEXEC (Exec format error)
open("./zero", O_RDONLY)                = 3
read(3, "", 80)                         = 0
close(3)                                = 0
exit_group(0)        

【问题讨论】:

  • 我在bash的源码中找到了相关代码,但我还是很好奇github.com/bminor/bash/blob/…
  • 似乎是一个没有 shebang 的 shell 脚本的特殊情况,其中第二个 shell 的 exec 被优化了。
  • 代码是不言自明的,if (sample_len == 0) return (EXECUTION_SUCCESS); 请注意您链接到的 comment 的内容:"check to see ...第一行(或最多 80 个字符)在 ASCII 集中。如果是文本文件,则将内容作为 shell 命令执行..." 没有 she-bang,该文件为空,因此sample_len 将为零。
  • 就像rand = 4 一样不言自明。 what 是显而易见的,但 why 不是。

标签: unix sh posix


【解决方案1】:

如果execve(2) 返回错误并将errno 设置为ENOEXEC,所有shell 都会尝试将可执行文件作为shell 脚本运行,即。他们将使用作为参数给出的文件执行一个 shell。空脚本的退出状态为零(= 成功)[1]。

他们将运行什么 shell 完全取决于:bashksh93yash 将自己运行脚本; cshdashzshmksh 将始终使用 /bin/sh 运行它。

这种行为非常古老,早于 she-bang 功能和标准化的可执行文件格式,也是标准所要求的——从标准中阅读Command Search and Execution 的第 2 节。

execve 退出 -1ENOEXEC Exec format error 所以这不是操作系统行为。

然而,standard 需要 execvp()execlp() 库包装器的行为:

如果 exec 家族的其他成员 函数将失败并将errno 设置为ENOEXECexeclp()execvp() 函数应执行命令解释器和 执行命令的环境应如同进程使用execl() 调用sh 实用程序,如下所示:

execl(<shell path>, arg0, file, arg1, ..., (char *)0);`

[1] 在旧系统上,/bin/true 是一个仅包含版权声明的文件,说明它是“未发布的 AT&T 专有源代码”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多