首页 > 解决方案 > 如何在 Ruby 中的 Net::SFTP 对象中捕获登录提示?

问题描述

我正在尝试实现一个 Ruby 脚本,如果在尝试登录时出现登录提示,它将发送电子邮件通知Net::SFTP。关键是,如果出现登录提示,则 SFTP 上的登录方案有问题。问题是我如何在对象本身中捕获此状态,因为除非有有效的登录,否则对象实际上并没有被初始化。希望这是有道理的。

这是我正在尝试的脚本:

 def logon 
    counter = 0
    begin
      counter += 1
      @@sftp = Net::SFTP.start('<address>', Rails.application.credentials[:username], password: Rails.application.credentials[:password] )
    rescue TimeOutError
      retry if counter <=3
      UserMailer.logon_error.deliver_now if counter == 3
    ensure     
      UserMailer.logon_alert.deliver_now 
    end
  end

因此,如果尝试在 Rails 控制台中创建一个实例,例如@@sftp = Net::SFTP.start('moftp.mo.gov', Rails.application.credentials[:missouri_username], password: Rails.application.credentials[:missouri_password] )

如果密码有问题,我会收到提示:

User@sftp_address password:

出于隐私原因,我伪装了地址。

标签: ruby-on-railsrubysftp

解决方案


Net::SFTPNet::SSH在幕后使用。碰巧Net::SSH.start 有一个选项 :number_of_password_prompts,它告诉Net::SSH在发出异常之前要显示多少个密码提示。如果将其设置为零,如果密码丢失或无效,Net::SSH将失败。Net::SSH::AuthenticationFailed

:number_of_password_prompts => 密码验证方法的提示数默认为 3 设置为 0 以禁用密码验证方法的提示。

所以,你可以这样做:

begin
  Net::SSH.start(host, user, password: pass, number_of_password_prompts: 0)
rescue Net::SSH::AuthenticationFailed
  # Do something
end

推荐阅读