Cómo ejecutar un trabajo cron usando el comando sudo

118

¿Es posible ejecutar un trabajo cron que necesita el comando sudo ?

Me gusta:

 sudo rm somefile
sayem siam
fuente
Bienvenido Sayem Siam, mira las respuestas a esta pregunta askubuntu.com/questions/2368/how-do-i-setup-cron-job . como creo que su pregunta se ha hecho antes aquí en AU
stephenmyall
1
Estoy tratando de ejecutar sudo que necesita contraseña, pero ¿cómo puedo GIV contraseña del archivo cron
Sayem Siam
3
@sayemsiam no necesitas poner sudo, solo edita el crontab raíz.
Braiam
Mira esta respuesta .
sampablokuper

Respuestas:

240

No voy a entender cuánto es una mala idea; En pocas palabras, ejecutar sudoen crontab requiere que su contraseña se almacene en algún lugar en texto sin formato.

Es una mala idea.


El siguiente es el método preferido para ejecutar tareas administrativas a través de cron. Dado que realmente no necesita escribir sudoen el crontab, si está modificando el crontab de la raíz.

Usa el crontab de root

Ejecute el siguiente comando:

sudo crontab -e

Esto abre el rootcrontab. sudoNo es necesario ejecutar su comando en este contexto, ya que se invocará como de roottodos modos.

Por lo tanto, simplemente agregaría lo siguiente al crontab de root.

@hourly rm somefile

Ahora, si usted absolutamente quiere ser inseguro y correr riesgos con su contraseña, lo siguiente será ejecutar el comando desde el propio crontab, e introduzca la contraseña automáticamente cuando lo solicite sudo.

De nuevo, esto no es recomendable .


En su propio crontab, escriba su comando así:

@hourly echo "password" | sudo -S rm somefile

La desventaja obvia aquí es que, si alguien alguna vez accede a su crontab, su contraseña será legible en texto sin formato.

No deberías hacer esto.

SirCharlo
fuente
1
Me alegro de que funcione! Solo tenga cuidado con los agujeros de seguridad que deje atrás. Podrían volver más tarde para perseguirlo.
SirCharlo
1
@SirCharlo ¿Por qué usar rootel crontab de usuario en lugar del crontab de todo el sistema /etc/crontab?
Eliah Kagan
1
@Elijah, ¿por qué no?
SirCharlo
2
Esta respuesta pierde la marca porque pasa por alto las sutilezas disponibles en su sudoersarchivo, como los grupos de sudo sin un requisito de contraseña.
brent
punto muy muy útil, gracias por la gran ayuda.
Nasser Mansouri
33

Si está colocando el script desde uno de los directorios cron ( /etc/cron.*), entonces no necesita usar sudo ya que se está ejecutando como root.

Si está usando crontab, entonces querrá usar crontab de root. Esto lo ejecutará como root y tampoco necesitará sudo.

sudo crontab -e
tgm4883
fuente
1
También colocaría el comando en /etc/cron.hourly/something. Para eso están estos directorios.
John S Gruber
3
No. Podrías ponerlo en /etc/cron.SOMETHING/SCRIPT, pero no haría las dos cosas. Ambos darían aproximadamente la misma función, aunque usando crontab tendrías un poco más de poder sobre la frecuencia / cuándo se ejecutan las cosas.
tgm4883
1
Debería haber dejado claro que lo dije como una alternativa. Gracias.
John S Gruber el
3

Ejecute el siguiente comando en la terminal

sudo visudo

Se agregó la siguiente línea al final del archivo:

vidyadhar  ALL= NOPASSWD: /bin/rm

En el ejemplo anterior, vidyadhar es el nombre de usuario y no le pedirá contraseña si está ejecutando el comando rm a través de vidyadhar.

Vidyadhar
fuente
17
Hmm ... Entonces, cualquier comando malicioso, como sudo rm -rf 'slash'( no ejecute ese comando ), ejecutado desde ese usuario, no requerirá contraseña ... No sé, se siente inseguro, ¿no?
SirCharlo
Ya lo se. Tu enfoque es bueno. Pero estoy usando el enfoque anterior para otorgar derechos a otro usuario para detener / iniciar ciertos servicios.
Vidyadhar
24
Esta es una idea extremadamente mala. Por favor no hagas esto.
bkanuka
2
Quizás vidyadhar ALL= NOPASSWD: /bin/rm somefilesería más seguro.
Wernfried Domscheit
Esta es una idea terrible. Le diste permisos generales de sudo a rm. En su lugar, otorgue permisos sudo a un script su comando, incluyendo rm u otros en ese script, hágalo ejecutable, luego otorgue permisos sudo a ese script. <username> ALL=(ALL) NOPASSWD: /home/<username>/bin/<script>, lo que sería mucho más seguro.
RJ