◆ [Ruby] Net::FTP でワンタイムパスワード(OTP)認証
7行コードを追加するだけであら不思議。Net::FtpがOTP対応に。
という訳でレッツモンキー!!
require 'net/ftp' {~orangered:require 'otp'~} module Net class FTP {~orangered:CHALLENGE_RE = /otp-md5 ([0-9]+) ([a-zA-Z0-9]+)\s+/~} def login(user = "anonymous", passwd = nil, acct = nil) if user == "anonymous" and passwd == nil passwd = "anonymous@" end resp = "" synchronize do resp = sendcmd('USER ' + user) if resp[0] == ?3 raise FTPReplyError, resp if passwd.nil? {~orangered:m = resp.match(CHALLENGE_RE)~} {~orangered:unless m.nil?~} {~orangered:otp = OTP.new(m[1].to_i, m[2], passwd, "md5")~} {~orangered:passwd = otp.to_s~} {~orangered:end~} resp = sendcmd('PASS ' + passwd) end if resp[0] == ?3 raise FTPReplyError, resp if acct.nil? resp = sendcmd('ACCT ' + acct) end end if resp[0] != ?2 raise FTPReplyError, resp end @welcome = resp send_type_command @logged_in = true end end end
あとは普通に使うだけ。
ftp = Net::FTP.new("host name") ftp.login("user","password") ftp.passive = true files = ftp.list files.each do |f| puts f end
はたして需要は有るのか。