Obter indicação do comando ssh

3

Eu preciso obter indicação de que o comando ssh 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 eu não permaneço no servidor conectado. Eu não quero adicionar teste após o comando ssh , eu gostaria de fazer como eu faço até agora - por um comando.

Aqui está uma amostra 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
    
por Nir 04.10.2013 / 14:41

6 respostas

4

Você precisa exibir "SSH_OK" no servidor remoto e "SSH_NOK" no host local:

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

Mas eu manteria a sugestão de John de configurar o prompt para indicar em qual máquina você está - e é realmente 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 você 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 de sua saída, você deverá adicionar true após a execução do script (ou como o último comando executado antes do script sair para sempre) - isso fará com que sua sessão saia com sucesso (ou seja, com status de saída zero) e o "echo SSH_NOK" não será chamado.

    
por 04.10.2013 / 15:06
1

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 do status até sair do servidor. É assim que o SSH funciona. Se você vir o novo nome de host em seu prompt, então sabe que funcionou e está no servidor de destino.

    
por 04.10.2013 / 14:51
1

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

Exemplo

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

$

Veja 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
    
por 04.10.2013 / 15:16
1

você pode configurar uma função na máquina de origem para indicar na barra de título onde você está: Este exemplo é para bash ! adaptá-lo às suas necessidades (cuidado que a ordem de função / alias / caminho pode se tornar alias / função / caminho, que o comando command interno pode não existir (ou pode ignorar a coisa que você quer), etc. ele deve funcionar mesmo em muito antigo bash (como 2.05b ...)

No seu arquivo .profile, por exemplo, adicione essas linhas (mas teste antes):

# 1) define a prompt showing both in the title of the window/putty AND on the prompt :
#   who you are, on what machine, and where (which dir) :
PS1="\$(echo -ne '\[3]0;#'\${USER}@\${HOSTNAME}:\${PWD}'
# 1) define a prompt showing both in the title of the window/putty AND on the prompt :
#   who you are, on what machine, and where (which dir) :
PS1="\$(echo -ne '\[3]0;#'\${USER}@\${HOSTNAME}:\${PWD}'%pre%7\]')### \${USER}@\${HOSTNAME}:\${PWD} #"

#and 2) redefine "ssh" to be a function that also indicate where you go to:
ssh () { #the function do ssh, but also indicate where it ssh to (in the title of the window)
   #change the title
   echo -ne "3]0;In ssh $@%pre%7";  #set xterm title (and Putty too)
   #do the ssh here
   command ssh "$@"     #note: 'command something' will bypass both a function AND a alias named 'something', whereas \something would just bypass an alias named 'something'
   #put back the title to something meaningful, once we finished the ssh
   echo -ne "3]0;#${USER}@${HOSTNAME}:${PWD}%pre%7";  #set xterm title (and Putty too)
}
7\]')### \${USER}@\${HOSTNAME}:\${PWD} #" #and 2) redefine "ssh" to be a function that also indicate where you go to: ssh () { #the function do ssh, but also indicate where it ssh to (in the title of the window) #change the title echo -ne "3]0;In ssh $@%pre%7"; #set xterm title (and Putty too) #do the ssh here command ssh "$@" #note: 'command something' will bypass both a function AND a alias named 'something', whereas \something would just bypass an alias named 'something' #put back the title to something meaningful, once we finished the ssh echo -ne "3]0;#${USER}@${HOSTNAME}:${PWD}%pre%7"; #set xterm title (and Putty too) }

Dessa forma, tanto no seu prompt como no seu título você tem a informação de onde você está (graças ao PS1), e também quando você ssh em algum lugar você sabe onde você acaba (e quando terminar o prompt e o título onde você está imediatamente e não apenas no próximo prompt)

    
por 04.10.2013 / 17:27
1

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

  1. estabelecer uma conexão remota (e não fechar);
  2. faça suas coisas.

Para estabelecer uma conexão remota, execute uma sessão mestre. Então, para fazer coisas remotas, pegar carona na conexão existente. Conexões escravas usam o fluxo TCP existente, elas não requerem nenhuma autenticação extra, então elas terão sucesso (e serão rápidas de estabelecer), exceto, é claro, se a rede ou o host remoto ficar inativo.

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%/*}"
    
por 05.10.2013 / 04:37
0

Citado em sua outra pergunta:

Because this can take a while, I prefer not to use SSH - rather I prefer to check first if I can connect and if so then try to connect through SSH.

Você finalmente decidiu fazer testes com o SSH.

Se você estiver testando a conexão por meio do SSH antes de realmente se conectar por meio do SSH, estará desperdiçando seu tempo: levará o mesmo tempo para o teste falhar do que para a tentativa real de conexão falhar de qualquer maneira. Apenas tente se conectar diretamente.

Dito isto, se você realmente precisa testar a conexão antes de se conectar, eu acho que você pode fazer algo assim:

CONNECTION_TO_TEST="user1@server1"
ssh -q $CONNECTION_TO_TEST echo 2>/dev/null && echo SSH_OK && ssh $CONNECTION_TO_TEST || echo SSH_NOK
    
por 04.10.2013 / 16:14

Tags