シバンで 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 カーネルがシバン ライン経由でインタープリタを起動するとき、インタープリタ実行可能ファイルの 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 でのみ機能します :)