Preciso obter uma indicação de que o ssh
comando 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 ssh
comando, 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 true
apó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 é
- estabelecer uma conexão remota (e não fechá-la);
- 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%/*}"