quabbinの日記: [Ruby] 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
謎だ。
[Ruby] net-scpを使ってみた More ログイン