我想在ssh会话中检查exit
命令是否成功执行。
我的第一次尝试是使用命令exit && echo $? || echo $?
。echo $? || echo $?
,如果退出成功则应打印0。
如果echo
执行成功,则问题是exit
永远不会执行,因为连接已断开且后面的命令丢失。
我的第二次尝试是将命令拆分为两个命令,如下所示:
$ exit
$ echo $?
如果echo $?
执行成功,则 0
应为exit
但另一个问题是echo $?
可能被吞下,因为它发送得如此之快以至于在执行exit
之前到达远程ssh主机。
那么,在发送下一个命令之前如何确保在远程主机上执行exit
?
更新
使用阶段是我用程序语言执行shell命令并通过ssh管道流发送消息。所以,我不知道退出命令执行时间。如果退出命令没有完成,我的以下命令将被吞下,因为他们发送给退出的主人。
这就是为什么我关心执行的退出命令。
答案 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