bashシェル - SSHリモートスクリプトの出力と終了コードをキャプチャ?

bashシェル - SSHリモートスクリプトの出力と終了コードをキャプチャ?

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

私がこうすれば:

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機能を使用してフォーマットし、コンテンツをファイル、システムログ、および画面に送信するすべての出力をキャプチャしたいと思います。

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

答え1

正しいエラーコードが得られない理由は、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

答え2

「ローカル」が問題のようです。これは私にとって効果的です。

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

答え3

実際、上記の答えのどれも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 && echo "$err_msg" && exit $exit_code

関連情報