Shell通过ssh连接远程服务器无法获取返回值且执行挂起如何解决
脚本挂起原因
- 直接执行
ssh命令未指定远端运行指令:默认情况下ssh会启动远端服务器的交互式登录会话,持续等待用户输入操作,不会主动退出,因此脚本会卡在该步骤无后续输出。 - 目录检查逻辑位置错误:原脚本中判断
/etc/docker目录是否存在的代码运行在Serv1本地,完全没有在Serv2远端执行,不符合需求设计。
修复方案
将需要在Serv2远端执行的目录检查逻辑作为参数传递给ssh命令,ssh执行完远端指令后会自动断开连接,同时透传远端命令的返回状态给本地,调整后代码如下:
#!/usr/bin/env bash test_file(){ echo "Establishing ssh connection with Serv2." # 远端执行逻辑通过单引号包裹传入ssh,执行完成后自动断开连接 sshpass -p pswd ssh uid@serv2 'FILE=/etc/docker if [ -d "$FILE" ]; then echo "$FILE is a directory." exit 0 else echo "Check and try again. Closing the connection from Serv2." exit 1 fi' # 直接返回ssh命令的退出状态,即为远端逻辑的返回值 return $? } echo "Execution started from Serv1..." test_file retval=$? if [ "${retval}" -eq 0 ]; then echo "Directory is ready" else echo "Directory is not ready." fi
额外优化建议
非交互场景下使用ssh可以添加如下参数避免交互弹窗,进一步提高脚本稳定性:ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null uid@serv2 [执行指令]
内容的提问来源于stack exchange,提问作者Eupheus
相关产品推荐
相关产品推荐

