我有一个服务器主机(S)和一堆客户端(C1、C2、C3…)。我想分别打开S和C1、C2和C3之间的连接以进行双向通信。理想情况下使用插座。首选用于授权目的的SSH。
理想情况下:
- 客户端C1创建到S的SSH反向隧道,转发C1的端口,使其可以作为自己的端口在S上访问
- 在C1上运行的客户端程序创建一个套接字并绑定到转发端口
- 在S上运行的服务器程序创建一个套接字并绑定到转发端口
- 客户端和服务器可以交换数据
这样的事情可能吗?我试着用Python编写一个草稿,但没有用:
首先,我在C1:ssh -N -R 9999:localhost:15432 root@example.com
-OK 上运行
其次,在服务器上我运行:
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 9999))
serversocket.listen(5)
while True:
connection, address = serversocket.accept()
buf = connection.recv(64)
if len(buf) > 0:
print buf
break
第三,在客户端上我运行:
import socket
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 15432))
clientsocket.send('hello')
但我正在客户端上获取socket.error: [Errno 111] Connection refused
。另外,如果我先设置隧道,然后启动服务器程序,我会得到[Errno 98] Address already in use
。只有当我第一次启动程序,然后设置隧道时,它才有效。
如果前面提到的概念没有意义,你建议创建一种同步工具,让任何客户端都能侦听来自服务器的查询并用数据进行响应?(最好在Python中)。
提前谢谢。
-N
并没有做你认为它会做的事情:它旨在让ssh目的地能够连接回发起方。但这将使发起方成为服务器。
听起来应该使用-L
来简单地创建从客户端通过ssh隧道到服务器的连接。
演示:我有一个名为"bree"的本地服务器。在那台机器上,我执行(这也可能是你的python服务器在监听9999端口):
nc -l 9999
现在在我的客户端机器上,我在一个窗口中执行这个操作(或者可以把它放在后台):
ssh -N -L 9999:bree:9999 bree
这意味着:在本地(客户端)机器上侦听9999端口,当连接到它时,通过隧道转发请求,并连接到bree上的9999端口。
现在,在客户端机器上的第二个窗口中,我执行:
nc localhost 9999
两个nc
实例已连接。