使用Ruby中的net-sftp进行基于密钥的身份验证

7
我希望能够使用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

虽然这样做可以起作用,但需要密码。理想情况下,我想使用公钥身份验证,但是我在文档或在线上没有找到任何相关参考 - 这可行吗?

我不想使用chilkat。

谢谢。

2个回答

11
如果您想直接指定密钥(或其他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

8

这个自动完成的,只需上传您的公钥,就可以直接使用。

使用公钥/私钥进行连接

在明确提供密码之前,总是首先尝试使用公钥/私钥进行身份验证,即使您提供了密码也是如此。因此,如果您只想使用公钥/私钥身份验证,请从参数列表中删除密码。如果您能成功获取会话句柄,则说明您的密钥设置正确!


太棒了!谢谢。我尝试了一下,现在出现了以下错误: c:/ruby/lib/ruby/gems/1.8/gems/net-sftp-2.0.2/lib/net/sftp.rb:43:in start': und efined method shutdown!' for nil:NilClass (NoMethodError) from C:/sourcecode/log_downloader/sftp.rb:7:in `download' from C:/sourcecode/log_downloader/sftp.rb:24从SSH日志中看来,它似乎没有执行接受公钥、请求签名的步骤,而WinSCP则会要求我接受密钥?或者客户端会替我处理这个问题? - Ben Hall
这个能和 Net::SFTP 一起使用吗?还是只能和 Net::SSH 一起使用? - Mr_Nizzle
3
是的,这也适用于Net::SFTP。如果您正在使用Net::SSH/SFTP v2,可以将私钥作为:key_data选项传递给.start,如果将其保存到文件中不是一个好选择的话。 - Ari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接