5 votos

ssh no ejecutar comandos remotos cuando se ejecuta desde cron bash script - obras de CLI

Tengo un script escrito en bash, que se ejecuta desde cron. Una de las primeras cosas que hace es SSH a un host remoto y recuperar una lista de archivos en un directorio. Todo funciona bien cuando se ejecuta desde la línea de comandos, pero no desde cron.

La sección de la secuencia de comandos originalmente se veía así:

FILES=$($SSH_BINARY -i $SSH_KEY $SSH_USER@$REMOTE_HOST "ls $REMOTE_DIRECTORY")
echo "Got files = $FILES"

He añadido una instrucción echo por encima de la línea (se muestra a continuación) para demostrar que no era un camino o variable en cuestión:

echo "$SSH_BINARY -i $SSH_KEY $SSH_USER@$REMOTE_HOST \"ls $REMOTE_DIRECTORY\""

Si me tome la salida resultante de la línea y ejecutar el mismo usuario con el cron se (root), funciona sin problema.

El pensamiento de que puede tener algo que ver con la asignación a una variable, he modificado los ARCHIVOS de la línea= leer (así, poniendo el resultado directamente en mi last_run_output archivo):

$SSH_BINARY -vv -i $SSH_KEY $SSH_USER@$REMOTE_HOST "ls $REMOTE_DIRECTORY"

El cron entrada se parece a esto:

34 * * * * /root/path/to/my/script/get_logs.sh > /root/path/to/last_run_output 2>&1

Así, la PATHde la variable de asignación y permisos de los problemas a un lado, he empezado a utilizar indicadores de depuración en ssh. Me encontré una vez desde la línea de comandos, a continuación, desde cron, y la comparación de las salidas. Aquí están algunos aspectos destacados de la diff:

El lado es el intento fallido, el lado + es el exitoso intento de ejecutar fuera de cron.

@@ -87,9 +77,7 @@
 debug1: Remote: X11 forwarding disabled.
 debug1: Remote: Forced command: /home/sshacs/acssshsink netstorageuser
 debug1: Authentication succeeded (publickey).
-debug2: fd 4 setting O_NONBLOCK
 debug2: fd 5 setting O_NONBLOCK
-debug2: fd 6 setting O_NONBLOCK
 debug1: channel 0: new [client-session]
 debug2: channel 0: send open
 debug1: Entering interactive session.

No puedo explicar por qué estos descriptores de archivo se mencionan en debug2 cuando se ejecuta desde cron, pero parece estar relacionada (aviso lea<=0 rfd 4 len 0 línea de abajo):

@@ -100,20 +88,672 @@
 debug2: callback done
 debug2: channel 0: open confirm rwindow 0 rmax 32768
 debug2: channel 0: rcvd adjust 131072
-debug2: channel 0: read<=0 rfd 4 len 0
-debug2: channel 0: read failed
-debug2: channel 0: close_read
-debug2: channel 0: input open -> drain
-debug2: channel 0: ibuf empty
-debug2: channel 0: send eof
-debug2: channel 0: input drain -> closed
+  [[ Very large output of the ls command ]]
+debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
 debug2: channel 0: rcvd eof
 debug2: channel 0: output open -> drain
 debug2: channel 0: obuf empty
 debug2: channel 0: close_write
 debug2: channel 0: output drain -> closed
-debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
 debug2: channel 0: rcvd close
+debug2: channel 0: close_read
+debug2: channel 0: input open -> closed
 debug2: channel 0: almost dead
 debug2: channel 0: gc: notify user
 debug2: channel 0: gc: user detached

Todas las ideas son grandemente apreciados.

8voto

DarkGriffin64 Puntos 21

Intenta añadir la "-t -t" a su ssh opciones de conexión. Esta voluntad; fuerza de una pseudo terminal que se asignará.

1voto

Symmetric Puntos 158

Usted debe depurar el script más. Dos cosas para probar:

Rwrite para hacer el archivo de salida directamente en lugar de a través de la redirección de la salida. Es decir, en la secuencia de comandos de hacer esto:

$SSH_BINARY -i $SSH_KEY $SSH_USER@$REMOTE_HOST "ls $REMOTE_DIRECTORY" > savefile

Ejecutar el script con bash-x dentro de cron y guardar el resultado. Cambiar la primera línea del script para #!/bin/bash -x e intente algo como

34 * * * * /root/path/to/my/script/get_logs.sh > script_debug 2>&1

que debe ayudarle a concretar exactamente lo que su guión está haciendo. Sospecho que la redirección de la salida en el cron no está funcionando correctamente en este caso.

También, pregunta tonta: ¿has comprobado que la root puede escribir a /root/path/to/last_run_output? ¿Has comprobado que no tengas noclobber establecer de alguna manera cuando se ejecute el script en el cron?

EDIT: más ideas para solucionar problemas basados en los comentarios de OP.

Así que ninguna de las anteriores ideas parecen estar funcionando. ¿Qué acerca de cómo guardar el fielist en un archivo en la máquina remota y scp ing atrás? Que eliminaría cualquier extraño citando o redirección de entrada problemas.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: