2009-08-25 18 views
21

Parece que estoy atrapado entre una limitación de NFS y una limitación de Cron.¿Cómo ejecuto un comando como un usuario diferente de un cronjob raíz?

Tengo un cron de raíz (en RHEL5) que ejecuta un script de shell que, entre otras cosas, necesita para sincronizar algunos archivos en un montaje NFS. Y los archivos en el montaje NFS son propiedad del usuario apache con el modo 700, por lo que solo el usuario apache puede ejecutar el comando rsync; ejecutar como root produce un error de permiso (aparentemente, NFS es un caso raro, donde el usuario raíz es no todopoderoso?)

Cuando solo quiero ejecutar el rsync a mano, puedo usar "sudo -u apache rsync ..." Pero sudo no workie en cron - dice "sudo: lo siento, tú debe tener un tty para ejecutar sudo ".

No quiero ejecutar todo el script como apache (es decir, desde el crontab de Apache) porque otras partes del script requieren root, es solo ese comando que necesita ejecutarse como apache. Y realmente preferiría no cambiar el modo en los archivos, ya que eso implicará cambios significativos en otras aplicaciones.

Tiene que haber una manera de lograr "sudo -u apache" de cron ??

gracias! robar

+1

Sería mejor si pasase a SuperUser.com. – Robert

+0

Esta es una pregunta antigua, pero todavía la encontré bastante alta en los rangos de búsqueda, y ninguna de las respuestas explica por qué los permisos de raíz no se aplicaron al montaje de NFS. Para cualquiera que tropiece con esto, la razón es root_squash. Este blog tiene una explicación bastante decente de por qué esa opción es necesaria y, por lo general, se establece de forma predeterminada. http://fullyautolinux.blogspot.com/2015/11/nfs-norootsquash-and-suid-basic-nfs.html – BryKKan

Respuesta

7

Uso su en lugar de sudo:

su -c "rsync ..." apache 
+1

¡Sí! Pero no. El usuario apache no tiene un shell de inicio de sesión normal, por lo que la sintaxis su-c solo devuelve "Esta cuenta no está disponible actualmente". Y alterar la entrada de contraseña del usuario apache para este propósito parece una mala idea. Hm, supongo que esta pregunta debería titularse "¿Cómo ejecuto un comando como el usuario apache desde un cronjob raíz?" Y tal vez no se puede hacer sin introducir agujeros de seguridad. – rob

+5

¿Le sirve de ayuda si especifica explícitamente el shell que se utilizará con el modificador '-s' (por ejemplo' -s/bin/sh')?Al menos en Ubuntu esto parece ayudar si el usuario en cuestión no tiene un shell válido en/etc/passwd. –

+0

@JukkaMatilainen - Sí, eso también me funcionó en Ubuntu. – runamok

1

lugar en/etc/crontab y especificar Apache en lugar de la raíz en el campo de usuario

+0

No funciona en mi Debian 6. –

17

Do --shell =/bin/bash - -session mando = "/ ruta/a/comando -argumento = algo" nombre de usuario &

funciona para mí (CentOS)

+0

Tuve que agregar 'export TERM = xterm;' antes de mi comando dentro de la variable '--session-command'. Por lo tanto, terminé con 'su --shell =/bin/bash --session-command =" export TERM = xterm;/ruta/a/comando -argumento = algo "nombre de usuario &' –

+0

No funciona en Ubuntu (12.04) como el comando 'su' no admite la opción' --session-command'. – Lambart

+0

para aclarar la respuesta, en el crontab de raíz, agregue el 'su --shell =/bin/bash --session-command ="/ruta/a/comando -argumento = algo "nombre de usuario" – NoelProf

1

Si quieres que te permitirá de forma permanente a tocar el violín alrededor como Apache:

chsh apache 

esto le permite para cambiar el intérprete de comandos para el usuario

Cuestiones relacionadas