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

6
有没有使用Conch在Twisted内部启动带有端口转发选项的SSH会话以便通过隧道传输普通TCP流量的示例?
场景:
我有一个运行自定义基于Twisted的Protobuf RPC服务的服务器和安装了基于Twisted的RPC客户端的机器。服务器还运行着SSH。与其直接连接到服务器上的RPC服务,我想从RPC客户端使用SSH连接到服务器,设置服务器端口转发,并通过SSH隧道使用Protobuf与RPC服务进行通信。
我已经可以手动设置端口转发,并让RPC客户端通过指向客户端框上的本地端口与RPC服务通信,我只是想知道如何在客户端内部直接实现这一点。
2个回答

4
实现一个隧道Twisted SSH客户端,进行本地端口转发可能会非常简单。
只需创建一个基本的Twisted Conch SSH客户端,并在客户端的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服务器本身,因为你说你要连接的就是它)。

4
如果Twisted提供了更好的文档来完成Conch相关的操作,那将会非常棒(毕竟还有多少其他可编程的SSH库呢?)。在这一天到来之前,阅读conch命令行工具的实现可以大有帮助。
在这里,我们可以看到如何将命令行中的端口转发选项转换为SSH连接中的某些操作:

https://github.com/twisted/twisted/blob/4ffbe9f6851dbe7e9172f55905f264ecf50da3a6/src/twisted/conch/scripts/conch.py#L226-L238

我认为你在询问本地转发规则,因此localForwards循环大致做了你想要做的事情。


URL已失效。尝试查找并更新,但未成功。 - Levon

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