如何使用 Ruby 进行动态端口转发
How to do dynamic port forwarding using Ruby
如何在 Ruby 上进行 SSH 动态端口转发?
我尝试使用 "net/ssh/socks" 和 "net/ssh/gateway" 等 gem,但看起来它们已经过时了,因为我什至不需要它们。
我需要做的就是运行这个shell命令
ssh -D 5555 user@host -f -N
并接收该进程的PID。
我也试过用Kernel#system
和Kernel#spawn
。
例如:
pid = spawn("ssh -D 5555 user@host -f -N")
Process.wait pid
这对我来说很好用,但返回的 PID 总是比启动进程的真实 PID 少 3 个单位。比如返回的PID是1555
,真实的PID是1558
.
又一个问题:为什么PID的差值总是3,还能有别的差值吗?我可以可靠地使用 pid + 3
吗?
使用 SSH 二进制文件
你是 运行 SSH with -f
(fork)。在Ruby中,Kernel.spawn
会自动将进程fork到后台,所以不需要使用-f
。如果使用-f
会造成双叉的情况,这就是PID异常的原因。
这应该足以让它工作:
pid = spawn("ssh -N -D 5555 user@host")
使用 Net::SSH 和 Net::SSH::Socks
如果您想使用 net-ssh-socks
,您必须手动克隆存储库,因为 Rubygems 版本尚未更新为最新的 Net::SSH。
git clone https://github.com/cristianbica/net-ssh-socks
那么您的 Ruby 代码将如下所示,假设您克隆到您的脚本位于 运行 的同一文件夹中:
$:.push('net-ssh-socks/lib') # Add the cloned repo to load path
require 'net/ssh/socks'
ssh = Net::SSH.start('host', 'user')
ssh.forward.socks(5555)
ssh.loop { true }
如何在 Ruby 上进行 SSH 动态端口转发?
我尝试使用 "net/ssh/socks" 和 "net/ssh/gateway" 等 gem,但看起来它们已经过时了,因为我什至不需要它们。
我需要做的就是运行这个shell命令
ssh -D 5555 user@host -f -N
并接收该进程的PID。
我也试过用Kernel#system
和Kernel#spawn
。
例如:
pid = spawn("ssh -D 5555 user@host -f -N")
Process.wait pid
这对我来说很好用,但返回的 PID 总是比启动进程的真实 PID 少 3 个单位。比如返回的PID是1555
,真实的PID是1558
.
又一个问题:为什么PID的差值总是3,还能有别的差值吗?我可以可靠地使用 pid + 3
吗?
使用 SSH 二进制文件
你是 运行 SSH with -f
(fork)。在Ruby中,Kernel.spawn
会自动将进程fork到后台,所以不需要使用-f
。如果使用-f
会造成双叉的情况,这就是PID异常的原因。
这应该足以让它工作:
pid = spawn("ssh -N -D 5555 user@host")
使用 Net::SSH 和 Net::SSH::Socks
如果您想使用 net-ssh-socks
,您必须手动克隆存储库,因为 Rubygems 版本尚未更新为最新的 Net::SSH。
git clone https://github.com/cristianbica/net-ssh-socks
那么您的 Ruby 代码将如下所示,假设您克隆到您的脚本位于 运行 的同一文件夹中:
$:.push('net-ssh-socks/lib') # Add the cloned repo to load path
require 'net/ssh/socks'
ssh = Net::SSH.start('host', 'user')
ssh.forward.socks(5555)
ssh.loop { true }