我正在尝试实现一个 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