Rubyからsftpでネットワーク越しにファイルダウンロードする

非常にコネタですw

ハイハイ、おはようございます。

コネタです。コネタですけど、これって結構使う状況ってあると思うんです、よくわからん、妙なツールをこねくりましてバッチ書いたりしてる人がいますけど、Rubyだとさらっと書けて嬉しいですね、それもWindowsでもLinuxでも動くし

インストール

Ruby界の勝手がようやくわかってきました。Rubygemsでやっとけってことね
RubyからSSHで接続、ネットワーク越しにリモートコントロールすると同じように検索します

私はもう入れちゃってるんですけど、RubyからSSHで接続、ネットワーク越しにリモートコントロールするで入れたnet-sshというモジュールが依存関係にあるので先に入れるか、Rubygemsさんに解決してもらってください

gem search --remote sftp

でてきた

net-sftp (1.1.0, 1.0.1, 1.0.0, 0.9.0, 0.5.0)
   Net::SFTP is a pure-Ruby implementation of the SFTP client protocol.

容赦なくインストール

gem install net-sftp

完了

Successfully installed net-sftp-1.1.0
Installing ri documentation for net-sftp-1.1.0...
Installing RDoc documentation for net-sftp-1.1.0...


なんか毎度サラリとダウンロードしたり、モジュールインストールしてますが、事前に結構検索してます・・・この検索力の無さ、英語力の無さのせいで毎度めちゃくちゃ時間がかかってますがw

使ってみる

毎度のこと、日本語解説付きのサクっと使えるサンプルソースがないので、変に苦労してしまいました、う、う、う、ということで、血と汗と涙の結晶の6行をどうぞ

require 'rubygems'
require 'net/ssh'
require 'net/sftp'

session = Net::SSH.start("localhost", 22, "root", "hoge");
mySftp = session.sftp.connect
mySftp.get_file("/home/moge/hoge.txt", "./hogege.txt")

まずSSHのセッションオブジェクトを取得してそのセッションからsftpのコネクションを生成する。
このコネクションのメソッドget_fileに取得対象のファイルパスと保存先のローカルのファイルパスを引数で与えてやるとコピーされる

SSHのセッション取得をすっ飛ばして、このsftpのコネクションを一気に取得する書き方もあったんですけど、なんかうまく動作しなかったので、こっちでやってます。実装なんてこんなもんですw

このget_fileの戻り値はコピーしたバイト数のようなので、何かに使えそう
ワイルドカードが使えるかな〜と思いましたが、ダメでした

恐らくうまいやり方はあると思うのですけど、SSHのコマンドも打てるし、基本的なダウンロードができるようになったので、何をダウンロードするかは、Ruby側でこねくり回せばなんとかなりそうなんで、これでいいや
http://net-ssh.rubyforge.org/sftp/api/
http://net-ssh.rubyforge.org/sftp/faq.html


↓このやりかたに関する追加更新はたぶんこっちでやるので、この情報では不十分な場合はこちらへ
http://yakinikunotare.boo.jp/orebase/index.php?Ruby%2Fsftp%A4%C7%A5%D5%A5%A1%A5%A4%A5%EB%A4%F2%BC%E8%C6%C0%A4%B9%A4%EB