Shebangs 不喜欢 OSX 中的 sudo

use*_*769 1 linux sudo osx-mavericks shebang macos

在 shebang 中使用 sudo 似乎完全被破坏了。下面的代码:

#!/usr/bin/sudo /bin/bash
echo "this should work"
Run Code Online (Sandbox Code Playgroud)

在 Ubuntu 上工作正常,但在 OSX 上给我:

sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 
'nosuid' option set or an NFS file system without root privileges?
Run Code Online (Sandbox Code Playgroud)

有什么想法如何让它发挥作用吗?

注意: sudo 工作得很好,否则:

/usr/bin/sudo echo "This works"
Password:
This works
Run Code Online (Sandbox Code Playgroud)

Gor*_*son 5

看来,当 OS X 内核通过 shebang 行启动解释器时,它不会检查解释器可执行文件上的 setuid 位。可能应该被视为一个错误,尽管它可能被视为一种安全措施......但如果是这样,它就不是一个非常有用的错误,因为有一个相当简单的解决方法:

#!/usr/bin/env /usr/bin/sudo /bin/bash
echo "running as $USER"
Run Code Online (Sandbox Code Playgroud)

...这使得内核将脚本传递到 /usr/bin/env (不检查 setuid,但这在这里并不重要),后者将其传递到 /usr/bin/sudo (通过正常的启动过程,这确实遵守 setuid 标志),它切换到 root 并将脚本传递到 /bin/bash。

(顺便说一句,#!/usr/bin/env /usr/bin/sudo /usr/bin/ruby也有效。)