Шебанги не любят sudo в OSX

Шебанги не любят sudo в OSX

Использование 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 :)

Связанный контент