Аутентификация на основе ключа с помощью net-sftp в Ruby

Я хочу иметь возможность использовать SFTP для входа на несколько серверов и загрузки определенных файлов, чтобы помочь отлаживать проблемы по мере их возникновения. Хотя мы могли использовать клиент, мы хотели начать автоматизировать процесс, чтобы упростить все.

Моя первая попытка выглядит примерно так:

def download(files_to_download, destination_directory)
    Net::SFTP.start(@server, @username, :password => @password) do |sftp|
        files_to_download.each do |f|
            local_path = File.join(destination_directory, File.basename(f))
            sftp.download!(f, local_path)
        end
    end
end

Хотя это работает, это означает, что нам нужен пароль. В идеале я хочу использовать аутентификацию с открытым ключом, однако я не вижу никаких ссылок на это в документации или в Интернете - возможно ли это?

Я бы предпочел не использовать чилкат.

Спасибо


person Ben Hall    schedule 09.11.2009    source источник


Ответы (2)


Если вы хотите напрямую указать ключ (или другие параметры SSH) вы можете сначала открыть Net:: Соединение SSH, а затем выполнять оттуда операции SFTP.

Net::SSH.start("localhost", "user", keys: ['keys/my_key']) do |ssh|
  ssh.sftp.upload!("/local/file.tgz", "/remote/file.tgz")
  ssh.exec! "cd /some/path && tar xf /remote/file.tgz && rm /remote/file.tgz"
end

Это также работает для Net::SCP

Net::SSH.start('localhost', 'user', keys: ['keys/my_key'] ) do |ssh|
  ssh.scp.download("/local/file.txt", "/remote/file.txt")
end
person Pathogen    schedule 23.09.2014

Это делается автоматически, просто загрузите свой открытый ключ, и он должен работать сразу после установки.

Подключение с использованием открытых/закрытых ключей

Открытые/закрытые ключи всегда пробуются перед явной аутентификацией по паролю, даже если вы указываете пароль. Таким образом, если вы хотите использовать аутентификацию только с открытым/закрытым ключом, просто удалите пароль из списка аргументов. Если вы можете успешно получить дескриптор сеанса, ваши ключи настроены правильно!

person knoopx    schedule 09.11.2009
comment
Потрясающий! Спасибо. Я попробовал это и теперь получаю: c:/ruby/lib/ruby/gems/1.8/gems/net-sftp-2.0.2/lib/net/sftp.rb:43:in start': und efined method shutdown!' для nil: NilClass (NoMethodError) из C:/sourcecode/log_downloader/sftp.rb:7:in `download' из C:/sourcecode/log_downloader/sftp.rb:24 Судя по журналам SSH, это не так. сделать Принятие открытого ключа, запросить шаг подписи, который сделал winscp, где он попросил меня принять ключ? Или клиент позаботится об этом за меня? - person Ben Hall; 09.11.2009
comment
Это работает и с Net::SFTP? или это только с Net::SSH ? - person Mr_Nizzle; 08.08.2012
comment
Да, это работает и с Net::SFTP. И если вы используете Net::SSH/SFTP v2, вы можете передать закрытый ключ в .start как параметр :key_data, если сохранение его в файле вам не подходит. - person Ari; 12.01.2013