Ruby 如何通过 SSH 连接到跳转服务器并从该跳转服务器进行 SSH
How to SSH to a jumpoff server and SSH from that jumpoff server in Ruby
我正在寻找一种使用 ruby 通过 SSH 连接到跳转服务器并从该服务器通过 SSH 连接到另一台服务器的方法。跳转服务器是唯一可以访问最终服务器的服务器。我正在尝试 Net::SSH 但我似乎无法从已建立的 SSH 连接中获得 SSH 连接。
irb(main):021:0> require "net/ssh"
=> false
irb(main):022:0> Net::SSH.start("10.10.10.10", "admin") do |ssh|
irb(main):023:1* result = ssh.exec!("mm | grep 'dv ' | awk '{print }'").strip
irb(main):024:1> p "Going to try to login to #{result}"
irb(main):025:1> Net::SSH.start(result, "admin") do |ssh1|
irb(main):026:2* hostname = ssh1.exec!("hostname")
irb(main):027:2> p "In #{hostname}"
irb(main):029:2> end
irb(main):030:1> end
"Going to try to login to vz-int-api02"
SocketError: initialize: name or service not known
from org/jruby/ext/socket/RubyTCPSocket.java:129:in `initialize'
from org/jruby/RubyIO.java:1178:in `open'
from /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2 /lib/net/ssh/transport/session.rb:70:in `initialize'
from org/jruby/ext/timeout/Timeout.java:105:in `timeout'
from /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2 /lib/net/ssh/transport/session.rb:67:in `initialize'
from /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2 /lib/net/ssh.rb:207:in `start'
from (irb):25:in `evaluate'
from /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2 /lib/net/ssh.rb:215:in `start'
from (irb):22:in `evaluate'
from org/jruby/RubyKernel.java:1119:in `eval'
from org/jruby/RubyKernel.java:1519:in `loop'
from org/jruby/RubyKernel.java:1282:in `catch'
from org/jruby/RubyKernel.java:1282:in `catch'
from /usr/local/jruby-1.7.9/bin/irb:13:in `(root)'
我也尝试了 运行 直接从已建立的 SSH 连接建立 SSH 连接,但似乎无法从会话对象发起新会话:
irb(main):035:1> ssh.start(result, "admin") do |ssh1|
给出:
NoMethodError: undefined method `start' for #<Net::SSH::Connection::Session:0x5b11d0d8>
我可能从错误的角度解决了这个问题,但我找不到任何想通过 SSH 连接进行 SSH 的人。
这是可能的,但您应该使用 SSH 的内置 ProxyCommand
设置来完成它。如果您有 ~/.ssh/config
文件,那么 Net::SSH
将使用它。例如它可能看起来像这样:
Host the.protected.box
Hostname 10.10.10.20
ProxyCommand ssh 10.10.10.10 nc %h %p 2> /dev/null
那你可以说:
Net::SSH.start('the.protected.box', 'admin')
代理将正常工作。
如果您 运行 遇到问题,在将您的工作翻译成 Ruby.
之前,使用 ssh
命令行工具通常更容易调试它
如果您不想使用~/.ssh/config
,您可以在代码中设置代理命令:
require 'net/ssh/proxy/command'
proxy = Net::SSH::Proxy::Command.new('ssh 10.10.10.10 nc %h %p 2>/dev/null')
Net::SSH.start('10.10.10.20', 'admin', proxy: proxy)
您可以使用 SSH 端口转发来完成此操作。 Net::SSH gateway 会为您完成此操作,但您自己也很容易做到。
它基本上有一些看起来像这样的代码:
Net::SSH.start(...) do |ssh|
ssh.forward(12345, "internal host", 22)
ssh.loop { true }
end
这将设置隧道,然后您将建立一个新的 SSH 连接到 locahost 端口 12345。
我正在寻找一种使用 ruby 通过 SSH 连接到跳转服务器并从该服务器通过 SSH 连接到另一台服务器的方法。跳转服务器是唯一可以访问最终服务器的服务器。我正在尝试 Net::SSH 但我似乎无法从已建立的 SSH 连接中获得 SSH 连接。
irb(main):021:0> require "net/ssh"
=> false
irb(main):022:0> Net::SSH.start("10.10.10.10", "admin") do |ssh|
irb(main):023:1* result = ssh.exec!("mm | grep 'dv ' | awk '{print }'").strip
irb(main):024:1> p "Going to try to login to #{result}"
irb(main):025:1> Net::SSH.start(result, "admin") do |ssh1|
irb(main):026:2* hostname = ssh1.exec!("hostname")
irb(main):027:2> p "In #{hostname}"
irb(main):029:2> end
irb(main):030:1> end
"Going to try to login to vz-int-api02"
SocketError: initialize: name or service not known
from org/jruby/ext/socket/RubyTCPSocket.java:129:in `initialize'
from org/jruby/RubyIO.java:1178:in `open'
from /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2 /lib/net/ssh/transport/session.rb:70:in `initialize'
from org/jruby/ext/timeout/Timeout.java:105:in `timeout'
from /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2 /lib/net/ssh/transport/session.rb:67:in `initialize'
from /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2 /lib/net/ssh.rb:207:in `start'
from (irb):25:in `evaluate'
from /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2 /lib/net/ssh.rb:215:in `start'
from (irb):22:in `evaluate'
from org/jruby/RubyKernel.java:1119:in `eval'
from org/jruby/RubyKernel.java:1519:in `loop'
from org/jruby/RubyKernel.java:1282:in `catch'
from org/jruby/RubyKernel.java:1282:in `catch'
from /usr/local/jruby-1.7.9/bin/irb:13:in `(root)'
我也尝试了 运行 直接从已建立的 SSH 连接建立 SSH 连接,但似乎无法从会话对象发起新会话:
irb(main):035:1> ssh.start(result, "admin") do |ssh1|
给出:
NoMethodError: undefined method `start' for #<Net::SSH::Connection::Session:0x5b11d0d8>
我可能从错误的角度解决了这个问题,但我找不到任何想通过 SSH 连接进行 SSH 的人。
这是可能的,但您应该使用 SSH 的内置 ProxyCommand
设置来完成它。如果您有 ~/.ssh/config
文件,那么 Net::SSH
将使用它。例如它可能看起来像这样:
Host the.protected.box
Hostname 10.10.10.20
ProxyCommand ssh 10.10.10.10 nc %h %p 2> /dev/null
那你可以说:
Net::SSH.start('the.protected.box', 'admin')
代理将正常工作。
如果您 运行 遇到问题,在将您的工作翻译成 Ruby.
之前,使用ssh
命令行工具通常更容易调试它
如果您不想使用~/.ssh/config
,您可以在代码中设置代理命令:
require 'net/ssh/proxy/command'
proxy = Net::SSH::Proxy::Command.new('ssh 10.10.10.10 nc %h %p 2>/dev/null')
Net::SSH.start('10.10.10.20', 'admin', proxy: proxy)
您可以使用 SSH 端口转发来完成此操作。 Net::SSH gateway 会为您完成此操作,但您自己也很容易做到。
它基本上有一些看起来像这样的代码:
Net::SSH.start(...) do |ssh|
ssh.forward(12345, "internal host", 22)
ssh.loop { true }
end
这将设置隧道,然后您将建立一个新的 SSH 连接到 locahost 端口 12345。