パスワードを忘れた? アカウント作成
463088 journal

quabbinの日記: [Ruby] net-scpを使ってみた

日記 by quabbin

手元にファイルを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

謎だ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

身近な人の偉大さは半減する -- あるアレゲ人

読み込み中...