ruby - ssh 代理脚本在 ruby​​ 中运行但不在 jruby 中运行

标签 ruby jruby net-ssh

我有一个使用 net::ssh gem 的 ruby​​ 脚本。

它是一个简单的脚本,用于通过跳转服务器到目标框。该框仅对跳出服务器可见。这是脚本:

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

class TestTunnel
  def initialize
    proxy = Net::SSH::Proxy::Command.new('ssh admin@10.10.10.10 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=true 运行时,我可以看到 jruby 是 1.7.9,我可以看到它使用的是 ruby​​ 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$

有什么方法可以让它像在 ruby​​ 中一样在 jruby 中运行,或者我从 jruby 中调用 bash 脚本的解决方案是唯一的方法吗?

一个

最佳答案

这听起来很像 this bug在 net-ssh 中已在 net-ssh 3.0.2 中修复。

关闭该问题 t 的提交消息是“错误修复:代理命令错误地使用非阻塞 io api 导致罕见的 IO::EAGAIN 错误”,这听起来正是您所得到的。

关于ruby - ssh 代理脚本在 ruby​​ 中运行但不在 jruby 中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36402048/

相关文章:

JRuby - 包括 Java 与需要 "java"- 有什么区别?

ruby-on-rails - 如何在ruby-on-rails应用程序顶部使用dBpedia设置neo4j?

ruby net-ssh-multi : passing a password as a parameter at runtime

ruby - 无方法错误 : ruby gem mechanize undefined method 'q= '

ruby - Hanami 验证年份小于 X

java - 将 jruby 脚本打包到包含所有依赖项的 jar 中?

ruby - 在没有 ssh-keygen 的情况下生成 SSH key 对(私有(private)/公共(public))

ruby - 使用 ruby​​ gem net-ssh-multi 同时在多个服务器上执行 sudo 命令

ruby - 如果单词没有出现在其他单词之前,则正则表达式匹配

ruby - 如何从 Jekyll 插件中调用 `handleize` Liquid 过滤器?