【问题标题】:Key based authenication with net-sftp in Ruby在 Ruby 中使用 net-sftp 进行基于密钥的身份验证
【发布时间】:2014-09-24 06:24:37
【问题描述】:

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

谢谢

【问题讨论】:

    标签: ruby ssh sftp ironruby


    【解决方案1】:

    如果你想直接指定密钥(或other SSH options)你可以先open a Net::SSH connection,然后从那里进行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
    

    【讨论】:

      【解决方案2】:

      它是自动完成的,只需上传您的公钥,开箱即可使用。

      使用公钥/私钥连接

      在显式密码验证之前总是尝试公钥/私钥, 即使您提供密码。因此,如果您只想使用公钥/私钥 身份验证,只需从参数列表中删除密码。 如果您可以成功获取会话句柄,那么您的密钥设置正确!

      【讨论】:

      • 太棒了!谢谢你。我试过了,现在得到: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) from C:/sourcecode/log_downloader/sftp.rb:7:in `download' from C:/sourcecode/log_downloader/sftp.rb:24 从 SSH 日志中,看起来它没有执行接受公钥,请求签名步骤,winscp 在它要求我接受密钥的地方做了什么?还是客户会帮我解决这个问题?
      • 这也适用于Net::SFTP 吗?还是只有Net::SSH
      • 是的,这也适用于 Net::SFTP。如果您使用的是 Net::SSH/SFTP v2,则可以将私钥作为 :key_data 选项传递给 .start,如果将其保存到文件中对您来说不是一个好选择。
      猜你喜欢
      • 2016-10-06
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-08
      • 2013-10-08
      • 2013-02-15
      • 1970-01-01
      相关资源
      最近更新 更多