1. 概要
さて、このサイトには「FTP」のリンクもはってあるのです。
その「FTP」のリンクが生きているかどうかをチェックするのに「open-uri」は使えませんわな。
#!/usr/bin/env ruby
require('uri')
require('open-uri')
uri = 'FTPサイト'
uri = URI.parse(uri)
begin
res = open(uri)
puts "#{res}"
rescue => error
puts("例外発生 [#{error.class}]")
error.backtrace_locations.each do | line |
puts("#{line}")
end
puts("#{self.class.name}")
puts("#{error.message}")
end
てなソースを書いて実行すると
> ./ソースファイル名.rb
例外発生 [Net::FTPPermError]
/usr/local/lib/ruby/2.4/net/ftp.rb:472:in `getresp'
・・・略・・・
/usr/local/lib/ruby/2.4/open-uri.rb:31:in `open'
./open_uri.rb:11:in `<main>'
Object
500 'RETR' not understood
ということになるのです。
FTP の場合、別のものを使わないといけませんわな。
下記を参考にさせていただくこととします。
「Ruby における FTP 通信のサンプルコード」
2. アクセスしてみる
参考サイトに習ってソースを書いてみました。
#!/usr/bin/env ruby
require('pry')
require('uri')
require('net/ftp')
uri = 'FTPサイト'
uri = URI.parse(uri)
ftp = Net::FTP.new
begin
ftp.connect(uri.host, uri.port)
ftp.login('anonymous','PASSWD')
ftp.quit
rescue => error
puts("例外発生 [#{error.class}]")
error.backtrace_locations.each do | line |
puts("#{line}")
end
puts("#{self.class.name}")
puts("#{error.message}")
end
参考サイトでは、ファイルの送受信までやっているようですが、わたしが今回やっているのは、サイトが生きているかどうかだけなので・・・。
実際はディレクトリ移動までやるべきかとは思いますが、今回は anonymous ユーザでログインできればよしということで・・・。
有効な FTP サイトで anonymous ユーザが有効な場合は
> ./ソースファイル名.rb
すんなり終わります。
FTP が無効もしくは anonymous ユーザが無効な場合は
> ./ソースファイル名.rb
例外発生 [Errno::ETIMEDOUT]
/usr/local/lib/ruby/2.4/socket.rb:64:in `connect'
/usr/local/lib/ruby/2.4/socket.rb:64:in `connect_internal'
/usr/local/lib/ruby/2.4/socket.rb:137:in `connect'
/usr/local/lib/ruby/2.4/socket.rb:627:in `block in tcp'
/usr/local/lib/ruby/2.4/socket.rb:227:in `each'
/usr/local/lib/ruby/2.4/socket.rb:227:in `foreach'
/usr/local/lib/ruby/2.4/socket.rb:617:in `tcp'
/usr/local/lib/ruby/2.4/net/ftp.rb:339:in `block in open_socket'
/usr/local/lib/ruby/2.4/timeout.rb:76:in `timeout'
/usr/local/lib/ruby/2.4/net/ftp.rb:334:in `open_socket'
/usr/local/lib/ruby/2.4/net/ftp.rb:375:in `block in connect'
/usr/local/lib/ruby/2.4/monitor.rb:214:in `mon_synchronize'
/usr/local/lib/ruby/2.4/net/ftp.rb:373:in `connect'
./ftp.rb:13:in `<main>'
Object
Operation timed out - connect(2) for IPアドレス:21
ホスト名自体が無効な場合は
> ./ソースファイル名.rb
例外発生 [SocketError]
/usr/local/lib/ruby/2.4/socket.rb:227:in `getaddrinfo'
/usr/local/lib/ruby/2.4/socket.rb:227:in `foreach'
/usr/local/lib/ruby/2.4/socket.rb:617:in `tcp'
/usr/local/lib/ruby/2.4/net/ftp.rb:339:in `block in open_socket'
/usr/local/lib/ruby/2.4/timeout.rb:76:in `timeout'
/usr/local/lib/ruby/2.4/net/ftp.rb:334:in `open_socket'
/usr/local/lib/ruby/2.4/net/ftp.rb:375:in `block in connect'
/usr/local/lib/ruby/2.4/monitor.rb:214:in `mon_synchronize'
/usr/local/lib/ruby/2.4/net/ftp.rb:373:in `connect'
./ftp.rb:14:in `<main>'
Object
getaddrinfo: hostname nor servname provided, or not known
となります。
うむ、いけそうだ。