2016-03-23 14 views
0

ruby​​を使ってSSHを実行し、そのサーバーSSHから別のサーバーにSSHする方法を探していました。ジャンプオフサーバーは、最終サーバーにアクセスできる唯一のサーバーです。 Net :: SSHを試していましたが、確立されたSSH接続からSSH接続を取得できないようです。Rubyでジャンプオフサーバーと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 $1}'").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を使いたいと思っている人はいませんでした。

+0

をlocahostする新しいSSH接続を行いますシェルコマンド(https://quizlet.com/44970397/linux-and-hacking-common-commands-and-memorize-mes-flash-cards/)しかし、私はこれをルビーでやりたいと思っています – amadain

答えて

1

これも可能ですが、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を使用したくない場合は、代わりにコード内でproxyコマンドを設定することができます。

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) 
+0

これは私が使った方法です。それはrubyで動作しますが、jrubyにはnet-sshバージョン3.0.2で修正されたruby> = 2.0という問題(https://github.com/net-ssh/net-ssh/issues/122)があります – amadain

1

をあなたはSSHのポートフォワーディングでこれを行うことができます。 Net::SSH gatewayはあなたのためにこれを行いますが、あなた自身で行うのは簡単です。

それは基本的にはこのようになりますいくつかのコードがあります。

Net::SSH.start(...) do |ssh| 
    ssh.forward(12345, "internal host", 22) 
    ssh.loop { true } 
end 

トンネルを設定して、あなたはところで、私はそれが経由を行うことができます知っているポート12345

関連する問題