繁体   English   中英

如何使用 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#systemKernel#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 二进制文件

您正在使用-f (fork)运行 SSH。 在 Ruby 中, Kernel.spawn会自动将进程分叉到后台,所以你不需要使用-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 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM