AWS CLI单终端实现RDS跳转连接及进程管理方案问询
整合EC2跳转机端口转发至单终端并避免僵尸进程
1. 用nohup将操作整合到单个终端
完全可以通过nohup结合后台执行,把所有操作压缩到一个终端里,具体步骤如下:
步骤1:完成AWS SSO登录
先在前台执行AWS SSO登录(交互式操作,必须完成后再进行后续步骤):
aws sso login --profile your-sso-profile
登录成功后,确保能正常SSH访问EC2跳转机。
步骤2:后台运行跳转机上的socat转发
在同一个终端里,用nohup将socat命令放到后台执行,同时重定向输出避免占用终端:
nohup ssh -i your-key.pem ec2-user@<ec2-jump-host-ip> \ "socat TCP-LISTEN:15432,fork,reuseaddr TCP:<rds-endpoint>:5432" \ > socat-forward.log 2>&1 &
- 示例中将EC2跳转机的15432端口转发到RDS的5432端口(若为MySQL则替换为3306)
nohup ... &让命令脱离终端后台运行,> socat-forward.log 2>&1将标准输出和错误输出写入日志文件
步骤3:同一终端启动本地端口转发
接着在当前终端启动本地到EC2跳转机的端口转发(此步骤可保持前台运行,方便随时用Ctrl+C终止):
ssh -i your-key.pem -L 127.0.0.1:5432:127.0.0.1:15432 ec2-user@<ec2-jump-host-ip>
完成后,本地5432端口即可转发至EC2跳转机的15432端口,最终连接到RDS。
2. 实现进程联动终止,避免僵尸进程
直接终止本地SSH转发会导致EC2上的socat进程残留为僵尸进程,可通过以下两种方式解决:
方式1:利用SSH ControlMaster复用连接
借助SSH的ControlMaster特性,让本地转发与远程socat共享同一连接,当本地转发终止时,远程进程会自动被清理:
- 创建临时SSH控制套接字目录:
mkdir -p ~/.ssh/controlmasters
- 启动带ControlMaster的后台连接并执行socat:
ssh -i your-key.pem -fN -o ControlMaster=yes -o ControlPath=~/.ssh/controlmasters/%r@%h:%p \ ec2-user@<ec2-jump-host-ip> \ -t "socat TCP-LISTEN:15432,fork,reuseaddr TCP:<rds-endpoint>:5432"
-fN让SSH后台运行,-t强制为socat分配伪终端- ControlMaster保持连接,ControlPath指定套接字文件路径
- 同一终端启动本地端口转发,复用已建立的连接:
ssh -i your-key.pem -o ControlPath=~/.ssh/controlmasters/%r@%h:%p \ -L 127.0.0.1:5432:127.0.0.1:15432 ec2-user@<ec2-jump-host-ip>
当用Ctrl+C终止本地转发时,SSH会关闭ControlMaster连接,远程socat进程也会随之终止,无僵尸进程残留。
方式2:用bash脚本跟踪PID并设置陷阱
编写bash脚本跟踪远程socat的PID,当本地转发终止时自动杀掉远程进程:
#!/bin/bash # 定义参数 EC2_HOST="<ec2-jump-host-ip>" RDS_ENDPOINT="<rds-endpoint>" LOCAL_PORT=5432 REMOTE_PORT=15432 KEY_FILE="your-key.pem" PROFILE="your-sso-profile" # 登录AWS SSO aws sso login --profile $PROFILE # 在远程启动socat并获取PID REMOTE_SOCAT_PID=$(ssh -i $KEY_FILE ec2-user@$EC2_HOST \ "nohup socat TCP-LISTEN:$REMOTE_PORT,fork,reuseaddr TCP:$RDS_ENDPOINT:5432 > /dev/null 2>&1 & echo \$!") # 设置陷阱:脚本终止时杀掉远程socat进程 trap 'ssh -i $KEY_FILE ec2-user@$EC2_HOST "kill $REMOTE_SOCAT_PID"' EXIT INT TERM # 启动本地端口转发 ssh -i $KEY_FILE -L 127.0.0.1:$LOCAL_PORT:127.0.0.1:$REMOTE_PORT ec2-user@$EC2_HOST
使用时赋予脚本执行权限并运行:
chmod +x rds-forward.sh ./rds-forward.sh
当用Ctrl+C终止本地转发时,陷阱触发自动清理远程socat进程,避免僵尸进程。
内容的提问来源于stack exchange,提问作者user19448827
相关产品推荐
相关产品推荐

