如何在Python Twisted中进行SSH端口转发?

时间:2012-10-03 14:44:20

标签: python ssh twisted portforwarding

是否有任何使用Conch从Twisted中启动与远程计算机的SSH会话以及端口转发选项的示例,以便可以通过隧道管道正常的TCP流量?

情景:

我有一台服务器运行自定义的基于Twisted的Protobuf RPC服务和一台安装了基于Twisted的RPC客户端的机器。服务器也在运行SSH。我不想直接与服务器上的RPC服务通信,而是使用来自RPC客户端的SSH连接到服务器,在服务器上设置端口转发,并使用Protobuf通过SSH隧道与RPC服务进行通信。

我已经能够手动设置端口转发并让RPC客户端通过将RPC客户端指向客户端盒上的本地端口来与RPC服务通信,我只是好奇我是如何在内部执行此操作的客户直接。

2 个答案:

答案 0 :(得分:4)

如果在Twisted中有改进的文档可以使用Conch做一些整洁的事情(毕竟,还有多少其他可编程SSH库?)会很棒。在那个快乐的日子到来之前,阅读conch命令行工具的实现可能会有很大的帮助。

在这里,我们可以看到命令行中的端口转发选项通过SSH连接转换为某些操作:

http://twistedmatrix.com/trac/browser/trunk/twisted/conch/scripts/conch.py#L188

我认为您在询问本地转发规则,因此localForwards循环大致正在执行您想要执行的操作。

答案 1 :(得分:4)

实现隧道本地端口转发的Twisted SSH客户端可以非常简单。

只需创建一个basic Twisted Conch SSH client,并在客户端的SSH连接类的 serviceStarted 方法中实现端口转发部分:

from twisted.conch.ssh import forwarding

LOCALPORT = 8888
REMOTEHOST = "127.0.0.1"
REMOTEPORT = 9999

class Connection(connection.SSHConnection):

    def serviceStarted(self):
       Channel = forwarding.SSHListenClientForwardingChannel
       Factory = forwarding.SSHListenForwardingFactory
       factory = Factory(self, (REMOTEHOST, REMOTEPORT), Channel)
       s = reactor.listenTCP(LOCALPORT, factory)

它的全部内容(REMOTEHOST设置为指向ssh服务器本身,因为那是你所说的你要连接到的)。