Ruby Net::SSH 多跳连接,每跳单独验证

Ruby Net::SSH multi-hop connection with individual authentication per hop

我正在编写一个 Ruby 脚本,它是 Host 0 上的 运行。
该主机可以看到 Host 1,它本身可以看到 Host 2。但是Host 2看不到Host 0.

Host 0 -> Host 1 -> Host 2

目标是在 Host 0Host 2 之间建立 SSH 连接,利用 Host 1

我当前的 SSH 配置文件如下所示:

host host1
Hostname host1.net
User user1

host host2
Hostname host2.net
User user2
ProxyCommand ssh host1.net -W %h:%p

脚本如下所示:

Net::SSH.start('host2', 'user1', 
{:password => 'password1', :timeout => 5, :paranoid => false, :config => './config_file'}) do |ssh|
  result = ssh.exec!("hostname")
  puts result
end

连接到 Host 1 效果很好。然后此方法开始尝试连接到 Host 2,但是 'forgets' paranoid 参数并且不提供 password2。失败了。

如何确保参数 paranoidpassword2 被传递到从 Host 1Host 2 的第二个 SSH 跃点?

我找到了一个无需配置文件即可工作的解决方案:GitHub (https://github.com/net-ssh/net-ssh-gateway)

上的 Net-SSH-Gateway 项目

它的集成使我能够像这样对每个跃点进行身份验证:

gateway = Net::SSH::Gateway.new(hop_1["address"], hop_1["user"], {:password => hop_1["pass"], :timeout => 5, :paranoid => false})
    
    gateway.ssh(hop_2["address"], hop_2["user"], {:password => hop_2["pass"], :timeout => 8, :paranoid => false}) do |ssh|
      puts ssh.exec!("hostname")
    end

gateway.shutdown!