RubyからSSHで接続、ネットワーク越しにリモートコントロールする

タイトル通りRubyからSSHLinuxサーバに接続していろいろしてしまいます
例によりまた試行錯誤して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 RubySSH クライアントライブラリ「Net::SSH」 - WebOS Goodies
http://webos-goodies.jp/archives/51357031.html