如何配置net-ssh,以便可以通过ssh隧道使用rest-client获取数据?

时间:2019-05-20 22:15:28

标签: ruby rest-client ssh-tunnel net-ssh

我们有一个elasticsearch设置,仅可通过跳转框使用。我想设置一个ssh隧道,以便可以从笔记本电脑或Docker容器中查询。 当我运行ssh时,可以直接运行,也可以通过“系统”运行ssh,并且我的帖子可以获取数据。当我尝试使用net-ssh设置隧道时,我得到了RestClient :: Exceptions :: ReadTimeout。我不确定net-ssh配置中缺少什么。我提供了一个简化的代码示例。

尝试在Windows和Cygwin上以及在运行Centos7的Docker容器中运行它。

require 'json'
require 'net/ssh'
require 'rest-client'

def fetchData
  indexName = "REDACTED"
  url = "http://localhost:9999/#{indexName}/_search?pretty"
  body = '{"size":1, "query":{"match_all":{}}}'
  resp = RestClient.post url, body, :content_type => :json, :accept => :json
  return JSON.parse(resp)
end

begin
  userName   = 'REDACTED'
  privateKey = 'id_rsa'
  jumpBoxUrl = 'REDACTED.com'
  elasticUrl = 'REDACTED.com'

  # this works
  system("ssh -fN -o StrictHostKeyChecking=no -i ~/.ssh/#{privateKey} #{userName}@#{jumpBoxUrl} -p 22 -L 9999:#{elasticUrl}:9200 sleep 10 >> logfile")
  puts fetchData

  # wait for the ssh to time out
  sleep 5

  # Timed out reading data from server (RestClient::Exceptions::ReadTimeout) - WHY?!
  #
  Net::SSH.start(jumpBoxUrl, userName, :port=>22, :forward_agent=>true, :verbose=>:info, :keys=>["~/.ssh/#{privateKey}"]) do |session|
    session.forward.local(9999, elasticUrl, 9200)

    # this works - able to authenticate to the shell box
    puts session.exec!("ls -la")

    # this times out - data is not returned
    puts fetchData
  end
end

我希望该帖子使用net-ssh时返回的数据与使用ssh时返回的数据相同。

感谢我对net-ssh设置中缺少的任何帮助。

1 个答案:

答案 0 :(得分:0)

我怀疑这与端口转发有关。在该块内,您应该可以访问elasticUrl:9200,因为此时您实际上已在Jumphost上。

我的建议是使用SSH进入Jumphost和curl API端点作为测试。如果可行,您应该能够逐字复制该命令并将其传递给session.exec!。最后,如果这行得通,那么您应该能够更新fetchData以向elasticUrl:9200发出请求,然后就可以开始比赛了。