2016-04-04 4 views
1

私はnet :: ssh gemを使用するrubyスクリプトを持っています。sshプロキシスクリプトはrubyで実行されますが、jrubyでは実行されません

これは、ジャンプボックスから目的地のボックスまでトンネルする簡単なスクリプトです。このボックスはジャンプオフサーバーにのみ表示されます。スクリプトは次のとおりです。

require 'net/ssh/proxy/command' 
require "net/ssh" 

class TestTunnel 
    def initialize 
    proxy = Net::SSH::Proxy::Command.new('ssh [email protected] nc %h %p 2>/dev/null') 
    p "proxy gotten" 
    Net::SSH.start("host1", "admin", :password => "admin", :proxy => proxy) do |ssh| 
     hostname = ssh.exec!("hostname") 
     p "In #{hostname}" 
    end 
    end 
end 
b=TestTunnel.new 

このスクリプトはrubyでは実行されますが、jrubyでは実行されません。私のフレームワークはjrubyで実行されるので、jrubyで使用する必要があります。

私の解決策は、私のjrubyスクリプトからbashスクリプトを呼び出してそこにトンネルをセットアップしてコマンドを実行することでしたが、私はむしろすべてをjrubyでやっていました。ここで

は私が取得エラーです:

~/src/main/ruby$ jruby --1.9 scripts/test_tunnel.rb 
"proxy gotten" 
IO::EAGAINWaitReadable: Resource temporarily unavailable - errno backtraces disabled; run with -Xerrno.backtrace=true to enable 

そして、私はRubyで実行します。

~/src/main/ruby$ ruby scripts/test_tunnel.rb 
"proxy gotten" 
"In vz-int-api02\n" 
~/src/main/ruby$ 

私は真-Xerrno.backtrace =と実行すると、私はJRubyのが1.7であることがわかります。 9私はそのルビー1.9使用していることがわかります。

~/src/main/ruby$ jruby -Xerrno.backtrace=true --1.9 scripts/test_tunnel.rb 
"proxy gotten" 
IO::EAGAINWaitReadable: Resource temporarily unavailable - 
    read_nonblock at org/jruby/RubyIO.java:2856 
      recv at /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2/lib/net/ssh/proxy/command.rb:75 
      fill at /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2/lib/net/ssh/buffered_io.rb:65 
    next_packet at /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2/lib/net/ssh/transport/packet_stream.rb:88 
    poll_message at /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2/lib/net/ssh/transport/session.rb:183 
      loop at org/jruby/RubyKernel.java:1519 
    poll_message at /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2/lib/net/ssh/transport/session.rb:178 
      wait at /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2/lib/net/ssh/transport/session.rb:215 
      loop at org/jruby/RubyKernel.java:1519 
      wait at /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2/lib/net/ssh/transport/session.rb:213 
    initialize at /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2/lib/net/ssh/transport/session.rb:87 
      start at /usr/local/jruby-1.7.9/lib/ruby/gems/shared/gems/net-ssh-2.9.2/lib/net/ssh.rb:207 
    initialize at scripts/test_tunnel.rb:8 
    (root) at scripts/test_tunnel.rb:15 
~/src/main/ruby$ jruby -Xerrno.backtrace=true --1.9 --version 
jruby 1.7.9 (1.9.3p392) 2013-12-06 87b108a on Java HotSpot(TM) 64-Bit Server VM 1.8.0_72-b15 +indy [linux-amd64] 
~/src/main/ruby$ 

すると、それはルビーか私にはないように、これはJRubyの中で実行するために取得する方法はあります私の解決策は、これを行うには唯一の方法jruby内からbashスクリプトを呼び出すには?

答えて

2

これはネットのssh 3.0.2で修正されたネットのsshでthis bugのようにたくさんの音。

この問題を解決したコミットメッセージは、「バグ修正:プロキシコマンドが非ブロック化io APIを使用して、まれにIO :: EAGAINエラーを引き起こしていました」というものです。

+0

thx。必要なルビーバージョンがhttps://rubygems.org/gems/net-ssh/versions/3.0.2から2.0以上であるように見えます。 rubyのバージョンを変更するにはあまりにも多くのコードがあるので、おそらくbashスクリプトを使う方が良いでしょう。 – amadain

+0

gemをフォークし、使用しているnet-sshのバージョンに修正をバックポートするのは難しいでしょう –