如何在Shell脚本中执行远程命令后正常退出SSH会话?
如何在Shell脚本中执行远程命令后正常退出SSH会话?
嗨,我来帮你解决这个问题!你遇到的困扰其实很多写Shell脚本的人都碰过——既想清晰地执行多个远程命令,又不想用-f把所有命令挤成一团,还得让SSH会话正常退出,不打断本地脚本的执行。
其实核心问题是:直接在脚本里调用ssh如果不带命令的话,会进入交互式SSH会话,脚本会卡住;而你尝试的exit是退出整个脚本,不是SSH会话。我们有更优雅的方式来处理多命令的远程执行,同时让SSH自动退出。
方法一:使用Here-Document(推荐)
这是最清晰的方式,适合写多行远程命令,甚至是带逻辑的复杂操作。它会把一段文本作为输入传给ssh,远程服务器执行完所有命令后,SSH会话会自动关闭,脚本回到本地继续执行。
修改你的脚本如下:
#!/bin/bash echo 'starting a thing...' mkdir folderA # 通过Here-Document传递多行远程命令,执行完自动退出SSH ssh messagecenter-dev -p 22001 << EOF uptime free -m cat /proc/loadavg EOF cd folderA echo 'I did a thing!' exit
这里的<< EOF和EOF是一对标记,中间的内容会被完整发送到远程服务器执行,你可以在里面写任意多行命令,甚至是if判断、for循环这类逻辑,可读性非常好。
方法二:多行单引号包裹命令
如果你的远程命令逻辑不算太复杂,也可以把命令放在单引号里,用分号分隔并换行:
ssh messagecenter-dev -p 22001 ' uptime; free -m; cat /proc/loadavg '
这种方式也能让SSH执行完所有命令后自动退出,相比-f参数,命令结构清晰很多。
额外注意点
如果你的远程服务器需要密码登录,脚本会卡在输入密码的环节,这种情况建议配置SSH密钥对免密登录,既安全又能让脚本自动执行。如果必须用密码,可以借助expect工具自动输入,但密钥对是更优的方案。
备注:内容来源于stack exchange,提问作者pbuchheit
相关产品推荐
相关产品推荐

