Shebangs 不喜欢 OSX 中的 sudo

Shebangs 不喜欢 OSX 中的 sudo

在 shebang 中使用 sudo 似乎完全失效了。以下代码:

#!/usr/bin/sudo /bin/bash
echo "this should work"

在 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?

有什么想法可以让它工作吗?

注意:否则 sudo 也可以正常工作:

/usr/bin/sudo echo "This works"
Password:
This works

答案1

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

#!/usr/bin/env /usr/bin/sudo /bin/bash
echo "running as $USER"

...这会让内核将脚本传递给 /usr/bin/env(不检查 setuid,但这里不重要),然后将其传递给 /usr/bin/sudo(通过正常启动过程,遵循 setuid 标志),它会切换到 root 并将脚本传递给 /bin/bash。

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

答案2

我找到了一种解决方法,但我很想知道是否有更好的方法来做到这一点。

最初的用途是用于 ruby​​ 脚本 - 我发现 ruby​​ 允许您执行以下操作:

#!/bin/bash
echo "sudo-running ${BASH_SOURCE[0]}"
sudo ruby "${BASH_SOURCE[0]}"
exit $?

#!ruby
puts "It works! File is #{__FILE__}"

当然,这只在 ruby​​ 中有效:)

相关内容