You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 15:53:09