如何在Bash脚本中后台运行AWS Session Manager端口转发命令?
AWS Session Manager端口转发后台运行问题解决
问题场景
在Bash脚本中使用AWS Session Manager的端口转发命令时,直接添加&试图让命令后台运行失败,需要让隧道后台持续运行,以便后续执行远程主机命令。
解决方法
1. 处理IO重定向实现后台运行
aws ssm start-session属于交互式命令,直接后台运行会因IO交互问题退出,需重定向标准输入、输出和错误:
aws ssm start-session \ --target $instance_id \ --region us-east-1 \ --reason "Remote tunnel to my service" \ --document-name serviceTunnel > /dev/null 2>&1 < /dev/null &
> /dev/null 2>&1:丢弃标准输出和错误输出< /dev/null:将标准输入绑定到空设备,避免进程因等待输入而退出
2. 用nohup确保进程存活
如果需要脚本退出后隧道仍保持运行,搭配nohup忽略SIGHUP信号(脚本退出时发送给子进程的终止信号):
nohup aws ssm start-session \ --target $instance_id \ --region us-east-1 \ --reason "Remote tunnel to my service" \ --document-name serviceTunnel > /dev/null 2>&1 < /dev/null &
3. 验证隧道状态与后续命令执行
- 查看进程确认隧道运行:
ps aux | grep "aws ssm start-session"
- 等待隧道建立后执行远程命令(以本地转发端口8080为例):
# 启动隧道 nohup aws ssm start-session ... > /dev/null 2>&1 < /dev/null & # 循环检测端口,最多等待10秒 for i in {1..10}; do if nc -z localhost 8080; then break fi sleep 1 done # 通过转发端口执行远程命令 ssh -p 8080 user@localhost "echo '执行远程任务'"
内容的提问来源于stack exchange,提问作者Meraj Kashi
相关产品推荐
相关产品推荐

