在 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 :)