如何检查执行ssh exit命令?

时间:2017-08-20 04:32:16

标签: shell ssh

我想在ssh会话中检查exit命令是否成功执行。

我的第一次尝试是使用命令exit && echo $? || echo $?echo $? || echo $?,如果退出成功则应打印0。 如果echo执行成功,则问题是exit永远不会执行,因为连接已断开且后面的命令丢失。

我的第二次尝试是将命令拆分为两个命令,如下所示:

$ exit
$ echo $?  
如果echo $?执行成功,则

0应为exit 但另一个问题是echo $?可能被吞下,因为它发送得如此之快以至于在执行exit之前到达远程ssh主机。

那么,在发送下一个命令之前如何确保在远程主机上执行exit

更新
使用阶段是我用程序语言执行shell命令并通过ssh管道流发送消息。所以,我不知道退出命令执行时间。如果退出命令没有完成,我的以下命令将被吞下,因为他们发送给退出的主人。 这就是为什么我关心执行的退出命令。

2 个答案:

答案 0 :(得分:1)

如果您主要担心的是您已经回到本地计算机,那么您可以在脚本中更早地定义一个变量,该变量在ssh之前在本地计算机上就已知。退出后,您可以测试该变量的存在。如果它存在,则返回本地计算机,如果不存在,则尝试再次退出,因为您没有返回本地计算机。

#define this before ssh
uniqueVarName333=1

然后在你的剧本中:

# ssh stuff
exit
if [ -z ${uniqueVarName333+x} ]; then exit; else echo "Back on local machine"; fi

或者您可以多次检查退出是否成功,以确保在您将其命令到远程计算机时成功。

exit || exit || exit #check it as many times as you feel to get the probability of exiting close to 0

答案 1 :(得分:1)

受@ 9Breaker的启发 我通过空闲时间(例如15ms)重复调用echo 'END-COMMAND'标志来解决这个问题 通过shell通道示例澄清这一点:

echo '' && echo 'BEGIN-COMMAND' && exit
echo 'END-COMMAND'
//if not response repeat send `echo 'END-COMMAND'`
echo $? && echo 'END-COMMAND'
//if not response repeat send `echo 'END-COMMAND'`
echo $? && echo 'END-COMMAND'

我们可以选择IO流字符并解析流媒体工具匹配BEGIN-COMMAN和END-COMMAND。
回应可能是成功的:

BEGIN-COMMAND
0
END-COMMAND  //should be send multi times to get the response
如果连接时网络中断,则

或失败:

BEGIN-COMMAND
ssh: connect to host 192.168.1.149 port 22: Network is unreachable
255
END-COMMAND
相关问题