Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Ruby测试SSH连接_Ruby_Ssh_Ruby 2.2 - Fatal编程技术网

如何使用Ruby测试SSH连接

如何使用Ruby测试SSH连接,ruby,ssh,ruby-2.2,Ruby,Ssh,Ruby 2.2,这就是我目前得到的。这很好,问题是我无法为ssh登录输入密码,我需要共享ssh密钥才能工作: def ssh_conn(user, host, &block) begin ping_output = [] timeout(20) do ping_output = IO.popen("ssh #{user}@#{host} 'echo \"success\"'", "w+") end ping = ping

这就是我目前得到的。这很好,问题是我无法为ssh登录输入密码,我需要共享ssh密钥才能工作:

  def ssh_conn(user, host, &block)
     begin
       ping_output = []
       timeout(20) do
         ping_output = IO.popen("ssh #{user}@#{host} 'echo \"success\"'", "w+")
       end
     ping = ping_output.readlines.join[/success/] ? true : false
     rescue Timeout::Error
       ping = false
     rescue
       ping = false
     end
   ping_output.close
   if block_given? && ping
     yield
   end
   return ping
 end

这里的问题是:如何做类似的事情,但通过传递给方法的参数输入密码?最好在不安装任何“外部”gems的情况下使用ruby本机类/方法。

我相信您不能用
ssh
本身来实现这一点,但这正是
sshpass
的目的,正如您在本文中所读到的那样。在Ubuntu中:

$ sudo apt-get install sshpass
然后像这样更改
IO
呼叫:

ping_output = IO.popen("sshpass -p ssh #{user}@#{host} 'echo \"success\"'", "w+")

另一种方法是重写代码以使用Ruby SSH客户端,例如,而不是使用system命令。这实际上是我的建议,因为它允许您在更高的抽象级别上工作,而不是处理系统问题。而且,结果看起来更漂亮!检查此(未测试)代码:


通过在StackOverflow中搜索,我发现 通过这样做,我能够解决我的问题:

def ssh_try(user, host, pass)
  puts "SSHing #{host} ..."
  Net::SSH.start( host.to_s, user.to_s, :password => pass.to_s ) do |ssh|
    puts ssh.exec!('date')
    puts "Logging out..."
  end
end

任何面临类似问题的人都可以尝试这种方法,在ruby中测试/使用ssh连接非常有效。

是的,我已经听说过sshpass,我已经尝试过了,效果非常好。sshpass的问题是我不允许安装任何东西,并且避免使用ruby gems(公司政策,不问-。-)。你不知道还有别的办法吗?可能在ruby中实现一个expect/send,类似于
expect“Password:”;发送“”
你更快了!嗯,很乐意帮忙;)
def ssh_try(user, host, pass)
  puts "SSHing #{host} ..."
  Net::SSH.start( host.to_s, user.to_s, :password => pass.to_s ) do |ssh|
    puts ssh.exec!('date')
    puts "Logging out..."
  end
end