net-scpを使ってみた
手元にファイルをSCPで転送してきて解析する作業をしたくなった。
しかしただWinSCPとかでやるのは面白くないので、rubyで組んでcronに登録できる形には出来ないかと考えてみた。
まずはscpをサポートするライブラリが無いか探す。
Owner@fam ~ $ gem search --remote scp *** REMOTE GEMS *** net-scp (1.0.1)
net-scpがあったので、これを使う。
net-scpは
Owner@fam ~ $ gem dependency net-scp Gem net-scp-1.0.1 net-ssh (>= 1.99.1, runtime)
net-sshの1.99.1以上に依存している。
幸い手元にはnet-sshの1.99.1以下に依存しているプロダクトはない。
そこで、依存関係を含めnet-scpをインストールする。
Owner@fam ~ $ gem install net-scp Successfully installed net-scp-1.0.1 1 gem installed Installing ri documentation for net-scp-1.0.1... Installing RDoc documentation for net-scp-1.0.1...
手元にnet-ssh 2.0.3 がinstallされていたため、net-scpのインストールのみで作業は完了。
次にドキュメントを見て使い方を学ぶ。
どうやら Net::SCP.start でチャンネルを開き、downloadでダウンロード、uploadでupload、それぞれメソッド呼び出し後にwaitしてやればいいらしい。
早速やってみる。
require 'rubygems' require 'net/scp' Net::SCP.start("yumemi", "user", {:password => "password", :compression => true}){|scp| channel = scp.download("/var/log/httpd/some_log", "yumemi_log/some_log", {:preserve => true}) channel.wait }
さっくり書けた。
ただ、compressionしないと、一定以上のサイズのファイル転送だと、なぜか接続が遮断される。
またcompressionしていても、凄く大きなファイルは接続が遮断される。
とりあえず、現在のところ、そこまで大きくないので問題は無いのだが…何故だろう。
/usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.3/lib/net/ssh/transport/packet_stream.rb:68:in `select': closed stream (IOError) from /usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.3/lib/net/ssh/transport/packet_stream.rb:68:in `available_for_read?' from /usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.3/lib/net/ssh/transport/packet_stream.rb:80:in `next_packet' from /usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.3/lib/net/ssh/transport/session.rb:155:in `poll_message' from /usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.3/lib/net/ssh/transport/session.rb:150:in `loop' from /usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.3/lib/net/ssh/transport/session.rb:150:in `poll_message' from /usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.3/lib/net/ssh/connection/session.rb:423:in `dispatch_incoming_packets' from /usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.3/lib/net/ssh/connection/session.rb:185:in `preprocess' from /usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.3/lib/net/ssh/connection/session.rb:169:in `process' from /usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.3/lib/net/ssh/connection/session.rb:133:in `loop' from /usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.3/lib/net/ssh/connection/session.rb:133:in `loop_forever' from /usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.3/lib/net/ssh/connection/session.rb:133:in `loop' from /usr/lib/ruby/gems/1.8/gems/net-ssh-2.0.3/lib/net/ssh/connection/session.rb:90:in `close' from /usr/lib/ruby/gems/1.8/gems/net-scp-1.0.1/lib/net/scp.rb:204:in `start' from ./log_collect.rb:4
謎だ。