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

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

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

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

私が経験している問題は、これが自動化スクリプトの一部であり、stdout必要なデータの代わりにしばしばこれを取得することです。

ssh_exchange_identification: Connection closed by remote host

LIST私はただ得ることができることを知っていますstdoutlsだから私はコマンドからより多くの情報を得ることができるコマンドを探しています。特に:

  • stdoutなぜならls- 今持っているから
  • stderr- あまりls興味がなく、問題がないと思います。
  • stdoutfor ssh- 興味がありません。何を出力するのかわかりません。
  • stderrsshfor-これが私が探しているものです正しいことを確認してください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つのケースを区別できますか?注意してスクリプトを修正してください。

関連情報