Obtenha indicação do comando ssh

Obtenha indicação do comando ssh

Preciso obter uma indicação de que o sshcomando foi bem-sucedido ou não, sem sair do servidor conectado.

Eu uso este comando:

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

Meu problema com esse comando é que não permaneço no servidor conectado. Não desejo adicionar test após o sshcomando, desejo fazê-lo como fiz até agora - por um comando.

Aqui está um exemplo de como funciona agora:

[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

E aqui está uma amostra do que eu quero:

[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

Responder1

Você precisa gerar "SSH_OK"no servidor remotoe "SSH_NOK" no host local:

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

Mas eu seguiria a sugestão de John de configurar o prompt para indicar em qual máquina você está - e na verdade é o que você sugeriu em sua pergunta. Você pode querer reconsiderar se toda a impressão extra é realmente útil.

Você também pode querer elaborar um pouco mais sobre o que exatamente está tentando alcançar - pode haver uma maneira melhor. Por exemplo, se você estiver executando um script cuja saída é analisada e que pode terminar com um erro, que, no entanto, é detectável em sua saída, você desejará adicionar trueapós a execução do script (ou como o último comando executado antes do script sai para sempre) - isso garantirá que sua sessão seja encerrada com sucesso (ou seja, com status de saída zero) e que o "echo SSH_NOK" não seja chamado.

Responder2

O que você quer não pode ser feito. Se você permanecer no novo servidor, não executará a parte do comando para obter o eco de status até sair do servidor. É assim que o SSH funciona. Se você vir o novo nome do host em seu prompt, saberá que funcionou e está no servidor de destino.

Responder3

Você precisa lidar com a saída do arquivo echo 2>&1.

Exemplo

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

$

Aqui está o que eu faria, usando um dos meus hosts, 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

Responder4

Se o seu objetivo é primeiro ter certeza de que você pode se conectar ao servidor remoto e depois fazer um monte de coisas local e remotamente, então minha recomendação é

  1. estabelecer uma conexão remota (e não fechá-la);
  2. faça suas coisas.

Para estabelecer uma conexão remota, execute uma sessão mestre. Então, para fazer coisas remotas, pegue carona na conexão existente. As conexões escravas usam o fluxo TCP existente, elas não requerem nenhuma autenticação extra, portanto, serão bem-sucedidas (e serão rápidas de estabelecer), exceto, é claro, se a rede ou o host remoto cair.

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%/*}"

informação relacionada