シェルを使用してリモートサーバー上のスクリプトを呼び出したいのですが。そのスクリプトの出力(そのログメッセージ)とそれが返す終了コードをキャプチャしたいと思います。
私がこれをすると:
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、および画面に送信していきます。
Varで結果をキャプチャし、リモートスクリプトから正しい終了コードを取得するにはどうすればよいですか?
正しいエラーコードが表示されない理由は、実際には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
「ローカル」が問題のようです。これは私にとってはうまくいきます:
local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?
実際、上記のいずれの回答も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