Usar sudo no shebang parece completamente quebrado. O seguinte código:
#!/usr/bin/sudo /bin/bash
echo "this should work"
funciona bem no Ubuntu, mas no OSX me dá:
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?
Alguma idéia de como fazer isso funcionar?
Nota: sudo funciona bem, caso contrário:
/usr/bin/sudo echo "This works"
Password:
This works
Responder1
Parece que quando o kernel do OS X inicia um interpretador através de uma linha Shebang, ele não verifica o bit setuid no executável do interpretador. Provavelmente deveria ser considerado um bug, embora seja possível que seja considerado uma medida de segurança... mas se for assim, não é muito útil, porque há uma solução bastante simples:
#!/usr/bin/env /usr/bin/sudo /bin/bash
echo "running as $USER"
... isso faz com que o kernel passe o script para /usr/bin/env (sem verificar o setuid, mas isso não importa aqui), que o passa para /usr/bin/sudo (através do processo normal de inicialização, quefazobedecer ao sinalizador setuid), que muda para root e passa o script para /bin/bash.
(Aliás, #!/usr/bin/env /usr/bin/sudo /usr/bin/ruby
também funciona.)
Responder2
Encontrei uma solução alternativa, mas adoraria saber se existe uma maneira melhor de fazer isso.
O uso original era para um script Ruby - descobri que Ruby permite fazer o seguinte:
#!/bin/bash
echo "sudo-running ${BASH_SOURCE[0]}"
sudo ruby "${BASH_SOURCE[0]}"
exit $?
#!ruby
puts "It works! File is #{__FILE__}"
Claro, isso só funciona em Ruby :)