我希望能够同时通过 SSH 连接到不同 NAT 后面的多个 Linux 设备。我无法配置他们所在的网络。但是,我无法让 ssh 通过现有连接。
我可以完全控制我的客户端和设备。到目前为止的流程如下:在我的客户端上,我首先运行
socat TCP-LISTEN:5001,pktinfo,fork EXEC:./create_socket.sh,fdin=3,fdout=4,nofork
Run Code Online (Sandbox Code Playgroud)
内容./create_socket.sh:
ssh -N -M -S "~/sockets/${SOCAT_PEERADDR}" -o "ProxyCommand=socat - FD:3!!FD:4" "root@${SOCAT_PEERADDR}"
Run Code Online (Sandbox Code Playgroud)
在设备上,我正在运行
socat TCP:my_host:4321 TCP:localhost:22
Run Code Online (Sandbox Code Playgroud)
但是,我认为没有任何内容进出FD:3!!FD:4,因为 ProxyCommand 是一个子进程。我也尝试过设置fdin=3,fdout=3并更改./create_socket.sh为:
ssh -N -M -S "~/sockets/${SOCAT_PEERADDR}" -o "ProxyUseFdpass=yes" -o "ProxyCommand=echo 3" "root@${host}"
Run Code Online (Sandbox Code Playgroud)
这会打印一个错误:
mm_receive_fd: no message header
proxy dialer did not pass back a connection
Run Code Online (Sandbox Code Playgroud)
我相信这是因为 fd 应该使用某种方式发送sendmsg,但 fd 无论如何都不是源自子进程。我想让它尽可能简单,这感觉接近可行。