Рубиновый сетевой-ssh:Как пройти аутентификацию с помощью открытого ключа с помощью шлюза
-
22-09-2019 - |
Вопрос
Я пытаюсь запустить сценарий на нескольких машинах, которые у меня на работе, чтобы собрать некоторую информацию о них, например, какую ОС они используют, какие службы на них работают, какие конфигурации и т. д.У меня есть машина, на которой я вхожу в систему перед подключением по SSH к любой другой машине из-за установленного на ней открытого ключа.Оттуда я могу подключиться ко всем другим машинам по SSH, не требуя ввода пароля.
Я хочу автоматизировать вход на все эти машины с этой машины, но сценарий выполняется на моей локальной машине.Итак, я только что узнал о Ruby-ssh-gateway и пытаюсь это сделать, но, похоже, не могу заставить работать аутентификацию по открытому ключу.
Я делаю что-то вроде этого:
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')
это работает, но это нецелесообразно, поскольку пароли на разных машинах разные.
Кто-нибудь знает, как я могу заставить эту работу работать?
Спасибо.
Решение
Находятся ли машины, с которыми вы разговариваете, за брандмауэром NAT?Если нет, вам не нужен Ruby-ssh-шлюз.
Создали ли вы открытый ключ в исходном ящике для пользователя, который запускает программу, и передали этот ключ целевому пользователю в каждом целевом ящике?
$ 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
Как только вы это сделаете, это будет так же просто, как использовать system или backtick для вызова ssh:
system('ssh machine "ls -l"')