如何使用 Ruby 测试 SSH 连接
How to test SSH connection using Ruby
这就是我到目前为止所得到的。这很好用,问题是我无法输入 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
这里的问题是:我怎样才能做类似的事情,但通过传递给方法的参数输入密码?最好使用 ruby 本机 Classes/Methods 而不安装任何 "external" gem。
我相信你不能用 ssh
本身来做到这一点,但这就是 sshpass
的目的,你可以在 serverfault answer 中读到。在 Ubuntu 中:
$ sudo apt-get install sshpass
然后像这样更改您的 IO
调用:
ping_output = IO.popen("sshpass -p ssh #{user}@#{host} 'echo \"success\"'", "w+")
另一种方法是重写您的代码以使用 Ruby SSH 客户端,例如 net-ssh,而不是使用系统命令。这实际上是我的建议,因为它允许您在更高的抽象级别上工作,而不是处理系统问题。此外,结果看起来更漂亮!检查这个(未经测试的)代码:
require 'net/ssh'
def ssh_conn(user, host, password, &block)
authentication_successful = Net::SSH::Authentication::Session.authenticate(host, user, password)
authentication_successful && (yield if block_given?)
authentication_successful
end
通过在 Whosebug 中稍微搜索一下,我找到了 this thread
我能够解决我的问题:
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
任何遇到类似问题的人都可以尝试这个方法,对 test/use ruby 中的 ssh 连接非常有效。
这就是我到目前为止所得到的。这很好用,问题是我无法输入 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
这里的问题是:我怎样才能做类似的事情,但通过传递给方法的参数输入密码?最好使用 ruby 本机 Classes/Methods 而不安装任何 "external" gem。
我相信你不能用 ssh
本身来做到这一点,但这就是 sshpass
的目的,你可以在 serverfault answer 中读到。在 Ubuntu 中:
$ sudo apt-get install sshpass
然后像这样更改您的 IO
调用:
ping_output = IO.popen("sshpass -p ssh #{user}@#{host} 'echo \"success\"'", "w+")
另一种方法是重写您的代码以使用 Ruby SSH 客户端,例如 net-ssh,而不是使用系统命令。这实际上是我的建议,因为它允许您在更高的抽象级别上工作,而不是处理系统问题。此外,结果看起来更漂亮!检查这个(未经测试的)代码:
require 'net/ssh'
def ssh_conn(user, host, password, &block)
authentication_successful = Net::SSH::Authentication::Session.authenticate(host, user, password)
authentication_successful && (yield if block_given?)
authentication_successful
end
通过在 Whosebug 中稍微搜索一下,我找到了 this thread 我能够解决我的问题:
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
任何遇到类似问题的人都可以尝试这个方法,对 test/use ruby 中的 ssh 连接非常有效。