使用zeromq在python中进行远程tcp连接

时间:2014-03-10 21:46:02

标签: python tcp client-server zeromq

我有一个需要与我管理的远程服务器通信的python客户端。他们使用zeromq进行通信。当我在本地测试客户端/服务器时,一切正常。但现在我在云上部署了客户端和服务器,每个客户端都使用不同的提供商。我的问题是,建立连接的最简单方法是什么(安全)?我假设我无法通过密码,即使我可以猜测还有更安全的替代品。

我知道如何使用ssh-keygen设置没有密码的ssh连接。那会有用吗?在发送tcp req之前,客户端是否需要与服务器建立ssh连接?如果有一个python库可以帮助解决这个问题,那将是一个很大的帮助。

谢谢!

更新: 所以超过24小时过去了,没有人回复/回答。我想我已经越来越接近解决这个问题了,但还没有完全解决这个问题。我将客户端的密钥添加到服务器上的.ssh / authorized_key,现在我可以在没有密码的情况下从客户端ssh到服务器。接下来,我按照post关于“使用SSH隧道化PyZMQ连接”。这是我在客户端代码中的内容:

1    context = zmq.Context()
2    socket = context.socket(zmq.REQ)
3    socket.connect("tcp://localhost:5555")
4    ssh.tunnel_connection(socket, "tcp://locahost:5555", "myuser@remote-server-ip:5555")
5    socket.send_string(some_string)
6    reply = socket.recv()

这不起作用。我真的不明白第3和第3行。 4我猜我在那里做错了什么。此外,我的服务器(托管在linode上)有一个“默认网关”IP和一个“公共IP” - 在隧道连接中我只指定了公共IP,这也是我用来ssh到机器的ip。

2 个答案:

答案 0 :(得分:10)

确实,ZMQ方式是 - 与SSH的隧道连接。您的示例正是需要完成的任务,除了应该使用connecttunnel_connection,而不是两者。

此外,在指定要连接的服务器时,请确保定义SSH端口,而不是ZMQ REP套接字端口。也就是说,您可以尝试myuser@remote-server-ip:5555myuser@remote-server-ip而不是myuser@remote-server-ip:22

import zmq
import zmq.ssh
context = zmq.Context()
socket = context.socket(zmq.REQ)
zmq.ssh.tunnel_connection(socket, "tcp://locahost:5555", "myuser@remote-server-ip")
socket.send(b"Hello")
reply = socket.recv()

最后,确保您已经安装了pexpect或paramiko - 它们实际上会进行隧道连接。请注意,如果您正在使用Windows,那么paramiko是唯一可行的解​​决方案 - pexpect openssh隧道无法在Windows上运行。

如果您使用paramiko而不是pexpect,请确保在paramiko=True参数中设置tunnel_connection

答案 1 :(得分:1)

我发现Python中的ssh最好是iffy,即使使用paramikofabric库,所以要进行调试,你可以尝试单独设置隧道,只是为了看看是不是问题连接断了。

例如:

ssh myuser@remote-server-ip -L 5050:localhost:5555 -N

这说:连接到myuser@remote-server-ip,每当我请求连接到我的计算机上的localhost:5050时,将其转发到ssh连接,以便remote-server-ip处的服务器认为它正在接收来自localhost:5555的连接。

-L构建隧道,-N表示不对连接执行任何其他操作。

在本地开发机器上运行另一个shell(例如,不同的终端窗口),尝试连接到localhost:5050处的zeromq服务器,该服务器实际上是在远程服务器上运行的zeromq。 / p>

可以在上面的ssh命令中使用5555:localhost:5555,但我发现这可能会造成混淆,并且经常与同一服务的本地副本冲突。