net-ssh Ruby: Comment authentifier avec pubkey aide d'une passerelle
-
22-09-2019 - |
Question
Je suis en train d'exécuter un script dans plusieurs machines que j'ai au travail, de recueillir des informations à leur sujet, comme celle qui OS ils sont en cours d'exécution, quels services leur sont destinés, certaines configurations, etc. J'ai une machine que je me connecte avant ssh-ment à l'une des autres machines, en raison de la configuration clé publique qu'il a. A partir de là, je peux ssh dans toutes les autres machines sans être demandé mon mot de passe.
Ce que je veux faire est d'automatiser l'enregistrement sur toutes ces machines de celui-là, mais le script est en cours d'exécution sur ma machine locale. Donc, je viens d'apprendre au sujet de-ssh-passerelle rubis et essaie, mais je ne peux pas sembler obtenir l'authentification pubkey fonctionne.
Je fais quelque chose comme ceci:
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
Mais je reçois une exception Net::SSH::AuthenticationFailed
.
Si, au contraire, je donne le mot de passe, comme suit:
gateway.ssh(machine, 'username', :password => 'password')
il fonctionne, mais ce n'est pas viable, puisque les mots de passe ne sont pas les mêmes machines à travers.
Est-ce que quelqu'un sait comment je peux faire ce travail?
Merci.
La solution
Les machines dont vous parlez à un pare-feu NAT? Sinon, vous n'avez pas besoin ssh-passerelle rubis.
Avez-vous créé une clé publique sur la boîte d'origine, pour l'utilisateur qui exécute le programme, et étant donné que la clé de l'utilisateur cible sur chaque boîte cible?
$ ssh-keygen -t dsa # Only do this once
$ ssh-copy-id -i ~/.ssh/id_dsa.pub user@machine
(enter the password)
et assurez-vous que la clé fonctionne:
$ ssh user@machine # should not ask for a password
Une fois que vous avez fait cela, il est aussi simple que l'utilisation du système ou backtick à débourser à ssh:
system('ssh machine "ls -l"')