RubyからSSHで接続、ネットワーク越しにリモートコントロールする
タイトル通りRubyからSSHでLinuxサーバに接続していろいろしてしまいます
例によりまた試行錯誤して2時間も!かかってしまいました!だってやりかたズバリ載ってないんだもん!
net-sshのインストール
標準ではできないっぽい。検索しまくったあげくなんだかrubygemsにあるらしいとのこと
さっそくrubygemsを使ってみる
調べる
gem search --remote ssh
そうすると
net-ssh (1.1.1, 1.1.0, 1.0.10, 1.0.9, 1.0.8, 1.0.7, 1.0.6, 1.0.5, 1.0.4, 1. .1) Net::SSH is a pure-Ruby implementation of the SSH2 client protocol.
なにやら出てきたのでインストールコマンド「ドン」
gem install net-ssh
また何かでた
Install required dependency needle? [Yn]
でっぺんど〜 ということで ニードルさんに依存してるようなのでニードルさんもぶち込むことにする。当然Y
エラー出たw
ERROR: While executing gem ... (Zlib::BufError)
エラーメッセージで検索したら適当に解決法がでてきたので試す。↓2つのコマンドでアップデートしとけとのこと
gem update --system
なんかめっちゃ入った
次にこれ
gem update
いくつかどのバージョンを入れるか聞かれるけど、スキップした
再びドン
gem install --remote net-ssh
Successfully installed net-ssh-1.1.1 Installing ri documentation for net-ssh-1.1.1... Installing RDoc documentation for net-ssh-1.1.1...
無事成功
接続してみる
またサンプルコードがなかなか見つからず、挙動もよくわからず結構苦労w
#sshのライブラリを使う用意 require 'rubygems' require 'net/ssh' #接続を開く、引数は ホスト、ポート番号(SSHは22番)、ユーザ名、パスワード session = Net::SSH.start("localhost", 22, "root", "hoge"); #同期シェルオブジェクトもらう myShell = session.shell.sync #一応開いてるか確認 if myShell.open? then puts "開いてます" #いくつかコマンドぶち込んでみる p myShell.pwd.stdout myShell.send_command("cd /") p myShell.send_command("pwd").stdout #閉じる myShell.exit end #切断 session.close
↑の同期シェルというのは1行実行してその結果をすぐ受けるお手軽なやつ。他もあるらしいが今は知らんw
この同期シェルの欠点は標準入力を送り込めないこと・・・だから
su -
なんて送り込むと
Password:
なんて標準入力を求められるので、この時点で正常に処理が進まなくなります。コマンドによってはオプションによって標準入力から受け取るパラメータを引数で取れる形にできるものもあるのでそれで回避できるかな
この同期シェルは標準的なコマンドはメソッドとして実装してるよう、どこまで出来るかは知らん
p myShell.pwd.stdout p myShell.send_command("pwd").stdout
これは同じ
うぉ・・・疲れた。
一応APIマニュアル・・・読んでもさっぱりわからんw
http://net-ssh.rubyforge.org/api/
http://net-ssh.rubyforge.org/chapter-1.html
↓忘れたころの追記はこちらでやりますので、なるべく同期はとりますけどここの情報だけで不十分なら参照してみて
http://yakinikunotare.boo.jp/orebase/index.php?Ruby%2FSSH%A4%C7%C0%DC%C2%B3%A4%B9%A4%EB
追記:
もっといい解説が出てました
Pure Ruby な SSH クライアントライブラリ「Net::SSH」 - WebOS Goodies
http://webos-goodies.jp/archives/51357031.html