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