使用Paramiko进行端口转发

25
我正在尝试使用Paramiko从python应用程序进行端口转发。我可以很好地设置SSH连接,但是我有点困惑如何使用paramiko.Transport。我已经找到了这个文件,但我无法理解其中的内容。从查看paramiko.Transport文档,似乎只需要使用open_channel函数的一行代码,但我无法弄清楚如何实现它。我正在尝试复制一个简单的ssh -L 8000:localhost:8000。请问有人能帮帮我吗?

2
所以我在这方面取得了一些进展,但我觉得可能走错了方向。我已经弄清楚如何通过调用原始连接上的get_transport()方法来操作open_channel命令,但是当我尝试使用它打开直接或转发的tcpip连接时,服务器返回Administratively Prohibited的错误,而在正常的SSH会话中使用-L端口转发时是可以的。有什么想法吗? - TimD
1
请问您能否发布您的代码/使用的代码部分? - Adam Baxter
2个回答

20
请找到一些使用paramiko-1.7.7.1pycrypto-2.6的代码,以及我从forward.py脚本中删除了从第115行到末尾的代码(以避免选项解析)。
import paramiko, sys
from forward import forward_tunnel

remote_host = "target_host"
remote_port = 8000
local_port  = 8000
ssh_host    = "my_ssh_host"
ssh_port    = 22

user     = "login"
password = "s3cr3t"

transport = paramiko.Transport((ssh_host, ssh_port))

# Command for paramiko-1.7.7.1
transport.connect(hostkey  = None,
                  username = user,
                  password = password,
                  pkey     = None)

try:
    forward_tunnel(local_port, remote_host, remote_port, transport)
except KeyboardInterrupt:
    print 'Port forwarding stopped.'
    sys.exit(0)

我已经从一台Windows工作站上成功地测试过了,使用了在Red Hat下的ssh服务器,并指向第三台服务器。(我使用Python 2.7.2)

希望这能有所帮助。


4
forward.py 的链接已经失效,请使用以下链接:https://github.com/paramiko/paramiko/blob/master/demos/forward.py。 - alanjds
hostkey=None 不安全(而 SSH 隧道的核心就是安全,对吗?)。确保提供实际的主机密钥,否则您会容易受到中间人攻击。或者,您可以使用高级的 SSHClient,它内置了对 known_hosts 文件(或其他方式)的主机密钥验证,而不是低级的 Transport。请参考 https://dev59.com/ymgv5IYBdhLWcg3wVfZ6#43093883 - Martin Prikryl

9
你可以使用https://github.com/pahaz/sshtunnel来进行操作。
pip install sshtunnel

代码示例:

import sshtunnel

with sshtunnel.open(
    (ssh_host, ssh_port),
    ssh_host_key=None,
    ssh_username=ssh_user,
    ssh_password=ssh_password,
    ssh_private_key=None,
    remote_bind_address=(REMOTE_HOST, REMOTE_PORT)) as server:

    def do_something(port):
        # Do something with port
        pass

    print("LOCAL PORT:", server.local_bind_port)

    do_something(server.local_bind_port)

代码示例中缩进似乎不正确...? - Petri
4
这个软件包不支持远程端口转发,只能进行本地转发。 - datashaman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接