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 0
和 Host 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
。失败了。
如何确保参数 paranoid
和 password2
被传递到从 Host 1
到 Host 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!
我正在编写一个 Ruby 脚本,它是 Host 0
上的 运行。
该主机可以看到 Host 1
,它本身可以看到 Host 2
。但是Host 2
看不到Host 0
.
Host 0
-> Host 1
-> Host 2
目标是在 Host 0
和 Host 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
。失败了。
如何确保参数 paranoid
和 password2
被传递到从 Host 1
到 Host 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!