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

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

使用步骤:

  1. 保存脚本为auto_ssh_forward.exp
  2. 赋予执行权限:chmod +x auto_ssh_forward.exp
  3. 运行脚本:./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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:01:03