Obtener indicación del comando ssh

Obtener indicación del comando ssh

Necesito obtener una indicación de si el sshcomando tuvo éxito o no sin salir del servidor conectado.

Yo uso este comando:

ssh -q  user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK

Mi problema con ese comando es que no me quedo en el servidor conectado. No deseo agregar prueba después del sshcomando, deseo hacerlo como lo hago hasta ahora: con un comando.

Aquí hay una muestra de cómo funciona ahora:

[nir@dhcppc4 ~]$ ssh -q  user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_NOK
[nir@dhcppc4 ~]$ hostname
dhcppc4
[nir@dhcppc4 ~]$ ssh -q  user1@server2 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_OK
[nir@dhcppc4 ~]$ hostname
dhcppc4

Y aquí hay una muestra de lo que quiero:

[nir@dhcppc4 ~]$ ssh -q  user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_NOK
[nir@dhcppc4 ~]$ hostname
dhcppc4
[nir@dhcppc4 ~]$ ssh -q  user1@server2 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_OK
[nir@server2 ~]$ hostname
server2

Respuesta1

Necesitas generar "SSH_OK"en el servidor remotoy "SSH_NOK" en localhost:

ssh -t -q $host 'echo '"$host"'SSH_OK; exec $SHELL' || echo "$host: SSH_NOK"

Pero me apegaría a la sugerencia de John de configurar el mensaje para indicar en qué máquina se encuentra, y en realidad es lo que sugirió en su pregunta. Quizás quieras reconsiderar si toda la impresión adicional es realmente tan útil.

Es posible que también desee explicar un poco más qué es exactamente lo que está tratando de lograr; podría haber una manera mejor. Por ejemplo, si está ejecutando un script cuya salida se analiza y que puede terminar con un error, que sin embargo es detectable a partir de su salida, querrá agregarlo truedespués de la ejecución del script (o como el último comando que se ejecuta antes del script). sale definitivamente) - eso asegurará que su sesión salga exitosamente (es decir, con estado de salida cero) y que no se llame al "echo SSH_NOK".

Respuesta2

Lo que quieres no se puede hacer. Si permanece en el nuevo servidor, no ejecuta la parte del comando para obtener el eco de estado hasta que salga del servidor. Así es como funciona SSH. Si ve el nuevo nombre de host en el mensaje, entonces sabrá que funcionó y que se encuentra en el servidor de destino.

Respuesta3

Necesita manejar la salida del archivo echo 2>&1.

Ejemplo

$ ssh -q skinner "echo 2>&1"

$

Esto es lo que haría, usando uno de mis anfitriones, Skinner:

$ ssh -q skinnerrr "echo 2>&1 > /dev/null"  && echo SSH_OK || echo SSH_NOK
SSH_NOK

$ ssh -q skinner "echo 2>&1 > /dev/null"  && echo SSH_OK || echo SSH_NOK
SSH_OK

Respuesta4

Si su objetivo es asegurarse primero de que puede conectarse al servidor remoto y luego hacer un montón de cosas de forma local y remota, entonces mi recomendación es

  1. establecer una conexión remota (y no cerrarla);
  2. haz tus cosas.

Para establecer una conexión remota, ejecute una sesión maestra. Luego, para hacer cosas remotas, aproveche la conexión existente. Las conexiones esclavas utilizan el flujo TCP existente, no requieren ninguna autenticación adicional, por lo que tendrán éxito (y serán rápidas de establecer) excepto, por supuesto, si la red o el host remoto fallan.

ssh_control=$(mktemp -d)/ssh.control
ssh -M -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1
if [ $? -eq 0 ]; then
  do_some_local_stuff
  ssh -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1
  do_some_more_local_stuff
  if ! ssh -O check -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1; then
    echo 'Uh-oh! The SSH connection died abruptly.'
  fi
fi
ssh -O exit -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1
rm "$ssh_control"
rmdir "${ssh_control%/*}"

información relacionada