シバンはOSXのsudoを好まない

シバンはOSXのsudoを好まない

シバンで 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 でのみ機能します :)

関連情報