如何在 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:

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

Net::SFTP

幕后使用Net::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

最新更新