Использование sudo в shebang, похоже, полностью сломано. Следующий код:
#!/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 :)