ruby-on-rails - 如何在 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
推荐阅读
- android - 为什么我的活动没有看到观察到的对象变化?
- c# - C# - 为扩展方法提供类型信息
- java - 包 org.hibernate.tool.hbm2x 不存在
- ruby-on-rails - 弃用警告:危险的查询方法(其参数用作原始 SQL 的方法)。如何包裹在 Arel 中?
- node.js - Websocket - 在下一个推送事件之前等待 http 请求回调执行
- sqlite - 通过根据条件从另一列添加先前的行值来更新/创建列
- python - 编写数据框字典以分隔 Excel 工作表
- python-3.x - OpenCV(4.1.0)错误:(-215:断言失败)
- error-handling - 将 .NET Framework 4.5 的 System.IO.FileSystemWatcher 的设置配置为可就错误、容错、健壮、智能等进行交流
- php - PHP Localhost 重定向您的次数过多