我有一个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()
这不起作用.我真的不明白第3和第4行,我认为我在那里做错了.此外,我的服务器(托管在linode上)有一个"默认网关"IP和一个"公共IP" - 在隧道连接中我只指定了公共IP,这也是我用来ssh到机器的ip.
的确,ZMQ方式是 - 与SSH的隧道连接.你的例子正是需要做的事情,除了一个应该使用connect
或tunnel_connection
不是两者.
此外,在指定要连接的服务器时,请确保定义SSH端口,而不是ZMQ REP套接字端口.也就是说,而不是myuser@remote-server-ip:5555
你可能尝试myuser@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
参数中设置.