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

2 ответа2

3

Похоже, что когда ядро OS X запускает интерпретатор через строку shebang, он не проверяет бит setuid в исполняемом файле интерпретатора. Вероятно, это следует считать ошибкой, хотя, возможно, это считается мерой безопасности ... но если это так, то она не очень полезна, потому что есть довольно простой обходной путь:

#!/usr/bin/env /usr/bin/sudo /bin/bash
echo "running as $USER"

... это заставляет ядро передавать скрипт в /usr /bin /env (без проверки setuid, но это не имеет значения), который передает его в /usr /bin /sudo (через обычный процесс запуска, который делает подчиняться Setuid флаг), который переключается в корень и проходит скрипт в /bin / Баш.

(Кстати, #!/usr/bin/env /usr/bin/sudo /usr/bin/ruby работает.)

0

Я нашел обходной путь, хотя я хотел бы знать, есть ли лучший способ сделать это.

Первоначальное использование было для сценария ruby - я обнаружил, что ruby позволяет вам делать следующее:

#!/bin/bash
echo "sudo-running ${BASH_SOURCE[0]}"
sudo ruby "${BASH_SOURCE[0]}"
exit $?

#!ruby
puts "It works! File is #{__FILE__}"

Конечно, это работает только в ruby :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .