bash shell-ssh远程脚本捕获输出和退出代码?


23

我希望使用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函数记录我的输出,但似乎无法获得正确的退出代码,我假设获得的代码是varianble赋值的代码。

我想继续使用我的LOG函数来捕获所有输出,并将其格式化并将其发送给我的文件,系统日志和屏幕。

如何在var中捕获结果并从远程脚本中获取正确的退出代码?


Answers:


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 $?

您也是对的,但jodanm更快!
mconlin

是的26秒
Hauke Laging

5
不是英语班,但是说“更快”是不正确的。
mtahmed

5
我知道这是个玩笑。我想是一个坏人。在互联网上没人知道你是狗。
mconlin 2013年

也约旦的答案解释了为什么这是问题所在:)
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.