Quiero iniciar un programa como root al arrancar y agregaré una de las siguientes líneas a rc.local:
sudo /path/my_prog sudo sh -c "/path/my_prog" su -c "/path/my_prog"¿Cuál es la diferencia entre estas tres líneas y cuál es la correcta?
No necesitas ninguno de ellos; rc.local se ejecuta con privilegios de root . La respuesta correcta es simplemente ejecutar su comando.
/path/my_prog su tiene sentido si eres root y quieres cambiar a una cuenta diferente.
sudo tiene sentido si está ejecutando en una cuenta sin privilegios y se le han otorgado los derechos para cambiar a otra cuenta (a menudo, pero no siempre, root ), generalmente con el requisito de poder proporcionar su contraseña de forma interactiva (aunque esto puede ser desactivado si es realmente necesario; obviamente, debe comprender lo que está haciendo antes de meterse con cosas relacionadas con la seguridad).
sh -c "command" es solo una forma ineficiente de ejecutar el command . Ejecutar un shell tiene sentido cuando realmente necesita funciones de shell como expansión de comodines, redirección, etc., o componentes de shell como cd .
Idealmente, es posible que desee asegurarse de que my_prog se ejecute en una cuenta de sistema dedicada sin privilegios; entonces la sintaxis seria
su otheraccount -c /path/my_prog donde obviamente necesita crear otheraccount y asegurarse de que tenga los privilegios necesarios para realizar esta tarea en particular.
su opcionalmente le permite agregar un guión solitario antes del nombre de la cuenta para que ejecute una sesión de inicio de sesión; pero para una cuenta de servicio, esto probablemente no tenga sentido.
sudo /path/my_prog ejecutará /path/my_prog con privilegios de sudo.
sudo sh -c "/path/my_prog" ejecutará /path/my_prog (especificado por el indicador -c ) con sh usando los privilegios de sudo.
su -c "/path/my_prog" ejecutará /path/my_prog (especificado por el indicador -c ) con su shell actual usando los privilegios de sudo.
El uso correcto depende de su caso de uso, por lo que en realidad depende de usted. En mi humilde opinión, sudo foo y su -c foo son básicamente lo mismo.