Ruby net-ssh:如何使用网关对pubkey进行身份验证

时间:2010-01-04 12:23:38

标签: ruby authentication ssh public-key net-ssh

我正在尝试在我工作的几台机器上运行一个脚本,以收集有关它们的一些信息,例如它们正在运行的操作系统,运行它们的服务,一些配置等等。我有一台机器在由于它具有公钥设置,我在ssh-ing到任何其他机器之前记录。从那里,我可以ssh到所有其他机器,而不会被要求我的密码。

我想要做的是自动登录所有这些机器,但脚本在我的本地机器上运行。所以我刚刚了解了ruby-ssh-gateway并尝试了这一点,但我似乎无法使用pubkey身份验证。

我这样做:

gateway = Net::SSH::Gateway.new('gatewaymachine', 'username', :password => 'password')
all_machines.each do |machine|
  gateway.ssh(machine, 'username') do |ssh|
    uname = ssh.exec!('uname -a')
    puts "machine: #{machine}; OS: #{uname}"
  end
end

但我得到Net::SSH::AuthenticationFailed例外。

相反,如果我提供密码,请执行以下操作:

gateway.ssh(machine, 'username', :password => 'password')

它确实有效,但这不可行,因为不同机器之间的密码不一样。

有谁知道如何才能使这项工作?

感谢。

1 个答案:

答案 0 :(得分:2)

您正在谈论的机器是否在NAT防火墙后面?如果没有,您不需要ruby-ssh-gateway。

您是否在原点框上为运行该程序的用户创建了一个公钥,并在每个目标框上为该目标用户提供了该密钥?

$ ssh-keygen -t dsa    # Only do this once
$ ssh-copy-id -i ~/.ssh/id_dsa.pub user@machine
(enter the password)

并确保密钥正常工作:

$ ssh user@machine      # should not ask for a password

完成后,就像使用系统或反引号来ssh一样简单:

system('ssh machine "ls -l"')