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

mco*_*lin 30 shell bash ssh remote

我希望使用 shell 来调用远程服务器上的脚本。我想捕获该脚本的输出(其日志消息)及其返回的退出代码。

如果我这样做:

ssh user@server /usr/local/scripts/test_ping.sh
echo "$?"
Run Code Online (Sandbox Code Playgroud)

我得到了退出代码,但无法捕获远程日志消息。

如果我这样做:

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

我可以使用我的 LOG 函数记录我的输出,但似乎无法获得正确的退出代码,我假设我获得的代码是来自变量赋值的代码。

我想继续使用我的 LOG 函数来捕获所有输出,因为它为我格式化并将内容发送到文件、系统日志和屏幕。

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

jor*_*anm 46

你没有得到正确的错误代码的原因local是因为实际上是最后执行的事情。您需要在运行命令之前将该变量声明为本地变量。

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到这个问题:

$ 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
Run Code Online (Sandbox Code Playgroud)


Hau*_*ing 9

“本地”似乎是问题所在。这对我有用:

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是个玩笑。我想是坏的。在互联网上没有人知道你是一只狗。 (7认同)
  • 不是英语课,但说“更快”是不正确的。 (5认同)
  • 你也是对的,但 jodanm 更快! (2认同)