【发布时间】:2013-09-28 20:52:40
【问题描述】:
配置
- LOCAL:将创建 ssh 连接并在 REMOTE 机器上发出命令的本地计算机。
- 代理:一个 EC-2 实例,可以通过 ssh 访问 LOCAL 和 REMOTE。
- REMOTE: 位于 NAT 路由器后面的远程机器(LOCAL 无法访问,但会打开与 PROXY 的连接并允许 LOCAL 与它建立隧道)。
端口转发步骤(通过命令行)
-
创建从 REMOTE 到 PROXY 的 ssh 连接,以将 REMOTE 机器上 22 端口上的 ssh 流量转发到 PROXY 服务器上的 8000 端口。
# 从远程机器运行
ssh -N -R 0.0.0.0:8000:localhost:22 PROXY_USER@PROXY_HOSTNAME -
创建从 LOCAL 到 PROXY 的 ssh 隧道,并将 ssh 流量从 LOCAL:1234 转发到 PROXY:8000(然后转发到 REMOTE:22)。
# 从本地机器运行
ssh -L 1234:localhost:8000 PROXY_USER@PROXY_HOSTNAME -
创建从 LOCAL 到 REMOTE 的转发 ssh 连接(通过 PROXY)。
# 在新的终端窗口中从本地机器运行
ssh -p 1234 REMOTE_USER@localhost# 我现在已经 ssh'd 到 REMOTE 框并且可以运行命令了
帕拉米科研究
我查看了questions 中的handful 与使用 Paramiko 进行端口转发相关,但他们似乎没有解决这种特定情况。
我的问题
如何使用 Paramiko 运行上述第 2 步和第 3 步?我基本上想跑:
import paramiko
# Create the tunnel connection
tunnel_cli = paramiko.SSHClient()
tunnel_cli.connect(PROXY_HOSTNAME, PROXY_PORT, PROXY_USER)
# Create the forwarded connection and issue commands from LOCAL on the REMOTE box
fwd_cli = paramiko.SSHClient()
fwd_cli.connect('localhost', LOCAL_PORT, REMOTE_USER)
fwd_cli.exec_command('pwd')
【问题讨论】: