Shebangs não gostam de sudo no OSX

Shebangs não gostam de sudo no OSX

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/rubytambé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 :)

informação relacionada