Bash atribui saída / erro à variável

5

Eu tenho a seguinte linha no meu arquivo bash:

LIST=$(ssh 192.168.0.22 'ls -1 /web');

O problema que estou tendo é que ele faz parte do script automatizado e geralmente recebo isso no stdout e não nos dados de que preciso:

ssh_exchange_identification: Connection closed by remote host

Entendo que LIST obtém apenas o stdout do ls . Então, estou procurando um comando que obtenha mais informações dos comandos. Em particular:

  • stdout para ls - Eu tenho isso agora
  • stderr para ls - não estou realmente interessado, não espero que exista um problema
  • stdout para ssh - Não estou interessado, nem sei o que seria produzido
  • stderr para ssh - ESTE É O QUE ESTOU PROCURANDO para verificar se ssh está correto. Estar vazio significa que eu tenho os dados em $LIST que eu espero
por Patrick Kusebauch 28.01.2017 / 22:19

2 respostas

5

Da página man do ssh no Ubuntu 16.04 (LTS):

EXIT STATUS
     ssh exits with the exit status of the remote command or with 255 if an error occurred.

Sabendo disso, podemos verificar o status de saída do comando ssh . Se o status de saída for 225 , saberemos que é um erro ssh e, se for qualquer outro valor diferente de zero, o erro ls .

#!/bin/bash

TEST=$(ssh $USER@localhost 'ls /proc' 2>&1)

if [ $? -eq 0 ];
then
    printf "%s\n" "SSH command successful"
elif [ $? -eq 225   ]
    printf "%s\n%s" "SSH failed with following error:" "$TEST"
else 
    printf "%s\n%s" "ls command failed" "$TEST"
fi
    
por 28.01.2017 / 22:39
3

Redirecione o erro padrão de ssh para um arquivo dentro da substituição de comando e, em seguida, teste para ver se o arquivo está vazio ou não:

output="$( ssh server 'command' 2>ssh.err )"

if [[ -s ssh.err ]]; then
    echo 'SSH error:' >&2
    cat ssh.err >&2
fi

rm -f ssh.err

que exibe SSH error: seguido da saída de erro capturada de ssh .

    
por 28.01.2017 / 22:37