如何在Bash脚本中自动完成SSH端口转发的交互式操作?
自动化SSH动态反向端口转发+本地端口转发
下面提供两种纯脚本化的实现方式,替代手动交互流程:
方法1:用Expect脚本处理交互
Expect专门用于自动化交互式命令,直接模拟手动操作流程:
#!/usr/bin/expect -f # 替换为你的远程主机和用户名 set remote_host "your_remote_host" set username "your_username" # 启动SSH反向端口转发进程 spawn ssh -R 0:someServer:1234 ${username}@${remote_host} # 匹配SSH输出的自动分配端口(适配常见的输出格式) expect -re {Allocated port (\d+) for remote forward to someServer:1234} set auto_port $expect_out(1,string) # 发送SSH转义序列~C send "~C" # 等待SSH交互提示符 expect "ssh>" # 发送本地端口转发命令并回车 send "-L 9876:localhost:$auto_port\r" # 保持会话运行,直到手动退出 interact
使用步骤:
- 保存脚本为
auto_ssh_forward.exp - 赋予执行权限:
chmod +x auto_ssh_forward.exp - 运行脚本:
./auto_ssh_forward.exp
方法2:纯Bash+SSH控制套接字(无需Expect)
利用SSH的ControlMaster特性,通过控制套接字发送命令,完全避免交互:
#!/bin/bash # 配置参数 REMOTE_HOST="your_remote_host" USERNAME="your_username" CONTROL_SOCKET="$HOME/.ssh/auto_forward_socket" # 1. 启动后台SSH进程,创建控制套接字,捕获自动分配的端口 auto_port=$(ssh -fN -M -S "$CONTROL_SOCKET" -R 0:someServer:1234 "${USERNAME}@${REMOTE_HOST}" 2>&1 | grep -oP 'Allocated port \K\d+') # 2. 通过控制套接字发送转义命令和本地转发规则 ssh -S "$CONTROL_SOCKET" -O send - "~C-L 9876:localhost:$auto_port\n" # 可选:保持会话,退出时清理套接字 trap 'ssh -S "$CONTROL_SOCKET" -O exit -' EXIT echo "端口转发已配置,自动端口:$auto_port,本地转发端口:9876" # 若要保持SSH会话前台运行,可替换为:ssh -S "$CONTROL_SOCKET" -O forward -
注意事项:
- 如果你的SSH输出格式不同(比如显示
Remote forwarding from 0.0.0.0:xxxx),需要调整grep的正则表达式,比如改为grep -oP 'Remote forwarding from 0.0.0.0:\K\d+' - 控制套接字会在脚本退出时自动清理(通过
trap),也可手动执行ssh -S "$CONTROL_SOCKET" -O exit -清理
内容的提问来源于stack exchange,提问作者Paul Grinberg
相关产品推荐
相关产品推荐

