Ruby Net-SSH: Como autenticar com o PubKey usando um gateway
-
22-09-2019 - |
Pergunta
Estou tentando executar um script em várias máquinas que tenho no trabalho, para reunir algumas informações sobre elas, como qual o sistema operacional está executando, quais serviços executam neles, algumas configurações etc. Eu tenho uma máquina na qual registro Antes de ssh-ing para qualquer uma das outras máquinas, devido à configuração de chave pública que possui. A partir daí, posso SSH em todas as outras máquinas sem ser solicitado minha senha.
O que eu quero fazer é automatizar o login em todas essas máquinas dessa, mas o script está em execução na minha máquina local. Então, acabei de aprender sobre Ruby-Ssh-Gateway e estou tentando isso, mas não consigo fazer com que a autenticação do PubKey funcione.
Eu faço algo assim:
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
Mas eu recebo um Net::SSH::AuthenticationFailed
exceção.
Se, em vez disso, eu forneço a senha, assim:
gateway.ssh(machine, 'username', :password => 'password')
Funciona, mas isso não é viável, pois as senhas não são as mesmas entre máquinas.
Alguém sabe como posso fazer isso funcionar?
Obrigado.
Solução
As máquinas com quem você está conversando por trás de um firewall nat? Caso contrário, você não precisa de rubi-ssh-gateway.
Você criou uma chave pública na caixa de origem, para o usuário que executa o programa e dada a chave para o usuário alvo em cada caixa de destino?
$ ssh-keygen -t dsa # Only do this once
$ ssh-copy-id -i ~/.ssh/id_dsa.pub user@machine
(enter the password)
E para garantir que a chave esteja funcionando:
$ ssh user@machine # should not ask for a password
Depois de fazer isso, é tão simples quanto usar o sistema ou o backtick para gastar para SSH:
system('ssh machine "ls -l"')