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

use*_*866 4 python tcp client-server zeromq

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

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

谢谢!

更新:超过24小时过去了,没有人回复/回答.我想我已经越来越接近解决这个问题了,但还没有完全解决这个问题.我将客户端的密钥添加到服务器上的.ssh/authorized_key,现在我可以在没有密码的情况下从客户端ssh到服务器.接下来,我关注了"使用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()
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*mur 11

的确,ZMQ方式是 - 与SSH的隧道连接.你的例子正是需要做的事情,除了一个应该使用connecttunnel_connection不是两者.

此外,在指定要连接的服务器时,请确保定义SSH端口,而不是ZMQ REP套接字端口.也就是说,而不是myuser@remote-server-ip:5555你可能尝试myuser@remote-server-ipmyuser@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()
Run Code Online (Sandbox Code Playgroud)

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

如果你使用paramiko而不是pexpect,请确保paramiko=Truetunnel_connection参数中设置.