Rubygems net/sshとnet/ssh/shellの関係

最近までrubysshをはった処理を書くときにはnet/sshを使っていた。
でもnet/sshでは、単発処理はかけるし、その標準出力は取得出きるけど、
cd hogehoge
touch hoge
cd
ln -s hogehoge/hoge fuge
みたいなディレクトリを移りながらの作業は記述できなかった。

そしたら、そういう目的用にnet/ssh/shellなるgem packageがあるのを発見。
この辺を参考にしながら導入した。
いくつか引っかかったのでメモ。
導入環境はDebian6.0.1
Ruby1.8.7 Rubygems1.3.7
net/sshが入っている事が前提なので、無ければ最初に

sudo gem install net-ssh

次に、 net-ssh-shellのインストール
普通にgemで入れる事もできるが、gemで入るバージョンにはバグがあるらしいのでgitで最新版を入れる。

git clone https://github.com/mitchellh/net-ssh-shell.git

ここで、添付のREADMEどおりにやったら、僕の環境ではうまくはいらなかった。
ので、ちょっとアレンジ。

cd net-ssh-shell
sudo gem install bundler
sudo gem install echoe
sudo gem build net-ssh-shell.gemspec

これでカレントディレクトリに
net-ssh-shell-0.2.0.gem
ができてるはずなので

sudo gem install net-ssh-shell-0.2.0.gem

で完了。
一応サンプルプログラム。
SSHセッションの呼び出し方はnet-sshとオプション共々同様。

#!/usr/bin/env ruby

require 'rubygems'
require 'net/ssh'
require 'net/ssh/shell'

Net::SSH.start('HOSTNAME', 'USERNAME',:keys =>'~/.ssh/id_rsa') do |ssh|
    ssh.shell do |sh|
        sh.execute! "cd /tmp"
        sh.execute! "touch testtest.test"
        p sh.execute! "exit"
    end
end