在 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 中有效:)