web-dev-qa-db-ja.com

bashは出力/エラーを変数に割り当てます

私のbashファイルには次の行があります。

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

私が抱えている問題は、それが自動化されたスクリプトの一部であり、必要なデータではなくstdoutで頻繁に取得されることです。

ssh_exchange_identification: Connection closed by remote Host

LISTstdoutlsのみを取得することを理解しています。したがって、コマンドからより多くの情報を取得するコマンドを探しています。特に:

  • stdout for ls-私は今それを持っています
  • stderr for ls-あまり興味がないので、問題はないと思います
  • stdout for ssh-興味がない、何が出力されるのかさえわからない
  • stderr for ssh-THIS IS何を探しているのかsshが正しいかどうかを確認します。これ空であることは、データが$LIST 私が期待する
5

Ubuntu 16.04(LTS)のssh manページから:

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

それを知っていれば、sshコマンドの終了ステータスを確認できます。終了ステータスが225、それはsshエラーであることがわかっています。それが他のゼロ以外の値である場合、それは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
5

sshの標準エラーをコマンド置換内のファイルにリダイレクトし、ファイルが空かどうかをテストします。

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

SSH error:に続いてsshからキャプチャされたエラー出力が表示されます。

3
Kusalananda