Usar sudo en el shebang parece completamente roto. El siguiente código:
#!/usr/bin/sudo /bin/bash
echo "this should work"
funciona bien en Ubuntu, pero en OSX me da:
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?
¿Alguna idea de cómo hacer que esto funcione?
Nota: sudo funciona bien de lo contrario:
/usr/bin/sudo echo "This works"
Password:
This works
Respuesta1
Parece que cuando el kernel de OS X inicia un intérprete a través de una línea shebang, no verifica el bit setuid en el ejecutable del intérprete. Probablemente debería considerarse un error, aunque es posible que se considere una medida de seguridad... pero si es así no es muy útil, porque hay una solución bastante simple:
#!/usr/bin/env /usr/bin/sudo /bin/bash
echo "running as $USER"
...esto hace que el kernel pase el script a /usr/bin/env (sin verificar setuid, pero no importa aquí), que lo pasa a /usr/bin/sudo (a través del proceso de inicio normal, quehaceobedecer el indicador setuid), que cambia a root y pasa el script a /bin/bash.
(Por cierto, #!/usr/bin/env /usr/bin/sudo /usr/bin/ruby
también funciona).
Respuesta2
Encontré una solución alternativa, aunque me encantaría saber si hay una mejor manera de hacerlo.
El uso original era para un script Ruby; descubrí que Ruby te permite hacer lo siguiente:
#!/bin/bash
echo "sudo-running ${BASH_SOURCE[0]}"
sudo ruby "${BASH_SOURCE[0]}"
exit $?
#!ruby
puts "It works! File is #{__FILE__}"
Por supuesto, esto sólo funciona en Ruby :)