bashシェル-sshリモートスクリプトは出力とキャプチャコードをキャプチャしますか?


23

シェルを使用して、リモートサーバーでスクリプトを呼び出したい。そのスクリプトの出力(ログメッセージ)とそれが返す終了コードをキャプチャしたいと思います。

これを行う場合:

ssh user@server /usr/local/scripts/test_ping.sh
echo "$?"

終了コードを取得しましたが、リモートログメッセージをキャプチャできません。

これを行う場合:

local RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo "$?" 
LOG "${RESULTS}";

LOG関数を使用して出力をログに記録できますが、正しい終了コードを取得できないようです。取得したコードは可変割り当てからのコードであると想定しています。

LOG関数を引き続き使用して、すべての出力をフォーマットし、ファイル、syslog、および画面に送信します。

結果を変数にキャプチャし、リモートスクリプトから正しい終了コードを取得するにはどうすればよいですか?


回答:


37

正しいエラーコードを取得できない理由localは、実際に最後に実行されるためです。コマンドを実行する前に、変数をローカルとして宣言する必要があります。

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?

ここで問題を確認できます。

$ bar() { foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2
$ bar() { local foo=$(ls asdkjasd 2>&1); echo $?; }; bar
0
$ bar() { local foo; foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2

8

「ローカル」が問題のようです。これは私のために働く:

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?

あなたも正しかったが、ヨダンはもっと速くなった!
mconlin

はい、26秒。
ハウケレイジング

5
英語のクラスではありませんが、「もっと速く」と言うのは間違っています。
mtahmed

5
私はそれが冗談だったことを知っています。悪いものだと思う。インターネットでは、あなたが犬であることを誰も知りません。
mconlin

また、ヨルダンの答えは、なぜこれが問題だったのかを説明しています:)
Doktor J

2

実際、上記の回答はいずれもsshエラーコードとメッセージをトラップしません。これは次のように実行できます(カスタム関数は無視してください)。

# move the deployment package from the tmp dir
msg=$(ssh -i "$(eval echo $identity_file)" -o ConnectTimeout=5 "$ssh_user"'@'"$ssh_server" \
sudo -iu "$etl_user" bash "$tgt_deployment_dir"'/src/bash/'"$run_unit/$run_unit"'.sh' \
    -a create-relative-package 2>&1)

# fail on any non-success
export exit_code=$?
export err_msg="network error: ""$msg"
test $exit_code -ne 0 && doExit $exit_code $err_msg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.