我希望使用 shell 来调用远程服务器上的脚本。我想捕获该脚本的输出(其日志消息)及其返回的退出代码。
如果我这样做:
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