语境
我有一个私人服务器,可以通过使用公共服务器作为代理访问
|------| |------| |-------|
|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(两者之间有很好的连接)
到目前为止我尝试过的
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获得的密钥和证书。
现在,如果客户端已从公共服务器启动,它就可以工作。我不知道如何从远程机器重定向 SSL 连接。
我尝试过的其他事情是声明一个铅锤 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 则会引发异常。
约束
我对私有服务器和公共服务器都没有 root 访问权限,但是任何可以使用 pip 安装的库都可以。我试过看看 paramiko,但我不知道从哪里开始......
更新
我找到了一个解决方案(见答案https://stackoverflow.com/a/68535406/6068769),但我还有几个问题,所以我还不接受它:
- 我不得不从线程服务器中删除验证器参数。使用 ssh 连接管道添加一个语法(客户端+服务器)是什么?
- 为了使解决方案正常工作,我需要在另一个终端 (
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协议是否有另一种解决方案?