私のBashファイルには次の行があります。
LIST=$(ssh 192.168.0.22 'ls -1 /web');
私が経験している問題は、これが自動化スクリプトの一部であり、stdout
必要なデータの代わりにしばしばこれを取得することです。
ssh_exchange_identification: Connection closed by remote host
LIST
私はただ得ることができることを知っていますstdout
。ls
だから私はコマンドからより多くの情報を得ることができるコマンドを探しています。特に:
stdout
なぜならls
- 今持っているからstderr
- あまりls
興味がなく、問題がないと思います。stdout
forssh
- 興味がありません。何を出力するのかわかりません。stderr
ssh
for-これが私が探しているものです正しいことを確認してくださいssh
。空であるということは、$LIST
期待したデータがあるという意味です。
答え1
Ubuntu 16.04(LTS)のsshのマニュアルページから:
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
答え2
コマンド置換で標準エラーを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
若干のバリエーションが必要だったことを覚えています。この試み:
cmd 2>>>$errmsg
おそらくトリプルリダイレクトでしょう。それは数年前のことです。エラーメッセージはerrmsg変数に印刷する必要があります。たぶん私が間違っているかもしれません。この場合、このバリエーションは100%保証されるというメッセージを受け取ります。
errmsg=`cmd 2>/dev/null`
このバリアントは、必要または不要な場合にエラーメッセージを表示しません。ただし、通常の出力もキャプチャできます。それでは、$を使用して2つのケースを区別できますか?注意してスクリプトを修正してください。