A los shebangs no les gusta sudo en OSX

A los shebangs no les gusta sudo en OSX

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

información relacionada