net/telnet

http://www.ruby-lang.org/ja/man/?cmd=view;name=net%2Ftelnet

require 'net/telnet'
# リモートホスト foobar に接続
telnet = Net::Telnet.new("Host" => "foobar") {|c| print c}
# ログイン
telnet.login("your name", "your password") {|c| print c}
# ログイン後、プロンプトが出るまで待ち合わせる
telnet.cmd("ls") {|c| print c}
# コマンド実行後、プロンプトが出るまで待ち合わせる
# 少し複雑な例
telnet.cmd("sleep 5 && echo foobar &") {|c| print c}
STDOUT.flush # <- これがないとここまで処理が来てることがわかりにくい
# 前のコマンドの出力を待ち合わせる
telnet.waitfor(/foobar\Z/) {|c| print c}
# ログインセッションの終了
telnet.cmd("exit") {|c| print c}
telnet.close

存在は何となく知っていたけど、あまりの便利さにビックリした。
名前のとおり、サーバに telnet でログインできて任意のコマンドを発行してその結果を表示することができる。だったら最初から telnet クライアント使ってログインしとけよと思うかもしれないが、複数の環境があってそれぞれでの実行結果を得たいときに便利。わざわざ一つずつ自分でログインして確かめなくてもいいのだ。なにより「サーバにログインしてコマンドを実行する」という行為は意外と敷居が高かったりする(そういう人がSE会社に入るなとは思うけど、世の中いろんな人がいるんです)。特にUNIX系サーバではそれが顕著でコマンドが分からないというよりは、「よく分からないから壊しちゃうかもしれなくて嫌」という方な気がする。
そんな嫌がる人・信用ならない人・何をしでかすか分からない人達に「ある処理を流すからコマンドを叩いて内容を確認して」といったお願いをしたい場合、ruby でプログラムを書いておいて Windows なら script2exe なんかで exe ファイルにしとけば、間違ってもデータを消すとかファイルを消すとかシステム壊すって事は無いと思うんだ(彼らがステップアップしないのは置いておいて)。使い回しもできるし。

このライブラリを使ってて改めて思ったのが、Ruby ってやっぱ便利。Rails なんかの Webアプリケーションフレームワークの今後とかはまだまだ不明だけど、作業用のユーティリティを作ったりなんかするときの異常に手になじむ感じがたまらない。