通过代理的 RPyC 连接
RPyC connection through proxy
上下文
我有一个私人服务器,可以使用 public 服务器作为代理访问
|------| |------| |-------|
|Remote| -> |Public| -> |Private|
|------| |------| |-------|
我可以通过
连接到私人服务器(ssh 密钥设置正确)
user@remote:$ ssh user@public
user@public:$ ssh user@private
user@private:$
或者在一行中:
user@remote:$ ssh -o ProxyCommand='ssh -W %h:%p user@public' user@private
问题:
现在,我希望能够从远程机器直接向私人服务器发送 RPyC
请求。
作为我为什么需要它的见解:远程机器有摄像头,而私人服务器有 gpus(两者之间有良好的连接)
到目前为止我尝试了什么
我设法 运行 SSL 连接,如 RPyC SSH connection
conn = rpyc.ssl_connect("private", port = 12345, keyfile="/path/to/my.key", certfile="/path/to/my.cert")
使用 Create a self signed X509 certificate in Python.
等方式获得的密钥和证书
现在,如果客户端已经从 public 服务器启动,它就可以工作了。我不知道如何从远程计算机重定向 SSL 连接。
我尝试过的其他方法是声明一个 plumbum SshMachine,如零部署教程所示 (https://rpyc.readthedocs.io/en/latest/docs/zerodeploy.html)
mach = SshMachine("user@private", ssh_opts=["-o ProxyCommand='ssh -W %h:%p user@public'"]
我可以使用它启动一个零部署服务器,但这并不令人满意,因为它使用了 python 的新(临时)副本,我需要使用从私有服务器安装的库(例如 cuda设置)。
当然,我不能将这两种方法结合起来,因为 ssl_connect
需要一个字符串作为主机名,如果给定 SshMachine 则会引发异常。
约束
我没有私有服务器和 public 服务器的根访问权限,但是可以使用 pip 安装的任何库都可以。我试过寻找例如在 paramiko 但我不知道从哪里开始...
更新
我找到了解决方案(见答案),但我还有几个问题,所以我还没有接受:
- 我不得不从线程服务器中删除验证器参数。用ssh连接管道加一个的语法是什么(client+server)?
- 为了使解决方案起作用,我需要在另一个终端 (
ssh -o ....
) 中打开远程和私人服务器之间的 ssh 连接。否则,SshMachine 拒绝连接并出现以下错误:
plumbum.machine.session.SSHCommsError: SSH communication failed
Return code: | 255
Command line: | 'true '
stderr: | /bin/bash: line 0 : exec: ssh -W private:22 user@public : not found
我可以接受预先打开连接,但如果我不需要打开连接会更干净。
- 是否有其他使用 SSL 协议的解决方案?
好吧,我不远,我只是错过了方法rpyc.ssh_connect
。
这是 MWE:
## Server
import rpyc
class MyService(rpyc.Service):
def on_connect(self, conn):
pass
def on_disconnect(self, conn):
pass
def exposed_some_computations(self, input):
return 2*input
if __name__ == "__main__":
from rpyc.utils.server import ThreadedServer
server = ThreadedServer(MyService, port=12345)
server.start()
## Client
from plumbum import SshMachine
import rpyc
mach = SshMachine("user@private", ssh_opts=["-o ProxyCommand='ssh -W %h:%p user@public'"])
conn = rpyc.ssh_connect(mach, 12345)
result = conn.root.exposed_some_computations(18)
上下文
我有一个私人服务器,可以使用 public 服务器作为代理访问
|------| |------| |-------|
|Remote| -> |Public| -> |Private|
|------| |------| |-------|
我可以通过
连接到私人服务器(ssh 密钥设置正确)user@remote:$ ssh user@public
user@public:$ ssh user@private
user@private:$
或者在一行中:
user@remote:$ ssh -o ProxyCommand='ssh -W %h:%p user@public' user@private
问题:
现在,我希望能够从远程机器直接向私人服务器发送 RPyC
请求。
作为我为什么需要它的见解:远程机器有摄像头,而私人服务器有 gpus(两者之间有良好的连接)
到目前为止我尝试了什么
我设法 运行 SSL 连接,如 RPyC SSH connection
conn = rpyc.ssl_connect("private", port = 12345, keyfile="/path/to/my.key", certfile="/path/to/my.cert")
使用 Create a self signed X509 certificate in Python.
等方式获得的密钥和证书现在,如果客户端已经从 public 服务器启动,它就可以工作了。我不知道如何从远程计算机重定向 SSL 连接。
我尝试过的其他方法是声明一个 plumbum SshMachine,如零部署教程所示 (https://rpyc.readthedocs.io/en/latest/docs/zerodeploy.html)
mach = SshMachine("user@private", ssh_opts=["-o ProxyCommand='ssh -W %h:%p user@public'"]
我可以使用它启动一个零部署服务器,但这并不令人满意,因为它使用了 python 的新(临时)副本,我需要使用从私有服务器安装的库(例如 cuda设置)。
当然,我不能将这两种方法结合起来,因为 ssl_connect
需要一个字符串作为主机名,如果给定 SshMachine 则会引发异常。
约束
我没有私有服务器和 public 服务器的根访问权限,但是可以使用 pip 安装的任何库都可以。我试过寻找例如在 paramiko 但我不知道从哪里开始...
更新
我找到了解决方案(见答案
- 我不得不从线程服务器中删除验证器参数。用ssh连接管道加一个的语法是什么(client+server)?
- 为了使解决方案起作用,我需要在另一个终端 (
ssh -o ....
) 中打开远程和私人服务器之间的 ssh 连接。否则,SshMachine 拒绝连接并出现以下错误:
plumbum.machine.session.SSHCommsError: SSH communication failed
Return code: | 255
Command line: | 'true '
stderr: | /bin/bash: line 0 : exec: ssh -W private:22 user@public : not found
我可以接受预先打开连接,但如果我不需要打开连接会更干净。
- 是否有其他使用 SSL 协议的解决方案?
好吧,我不远,我只是错过了方法rpyc.ssh_connect
。
这是 MWE:
## Server
import rpyc
class MyService(rpyc.Service):
def on_connect(self, conn):
pass
def on_disconnect(self, conn):
pass
def exposed_some_computations(self, input):
return 2*input
if __name__ == "__main__":
from rpyc.utils.server import ThreadedServer
server = ThreadedServer(MyService, port=12345)
server.start()
## Client
from plumbum import SshMachine
import rpyc
mach = SshMachine("user@private", ssh_opts=["-o ProxyCommand='ssh -W %h:%p user@public'"])
conn = rpyc.ssh_connect(mach, 12345)
result = conn.root.exposed_some_computations(18)