ssh経由でgrowlnotify実行

LinuxサーバからMacクライアントのGrowlに通知を出したい

MacBookAir買いました。MacといえばなんとなくGrowlということでなんでもかんでもGrowlで通知したい!Growlと連携するには基本的にはAppleScriptとかいうのを使うらしいのですが全く分かりません…しかし!コマンドラインなどから通知する機能として「growlnotify」というコマンドが用意されています。やったね!
このコマンドをサーバ側から実行すればなんとかなりそう…

サーバ側からコマンドを実行するには

サーバからMacBookAirにssh接続してgrowlnotifyコマンドを実行する方法でやろうと思います。
なんか逆な気もするけど…

MacBookAirのsshd有効化

GUIのシステム環境設定の「共有」にてリモートログインを有効に
・パスワードログイン有効化(/etc/sshd_config に「PasswordAuthentication yes」と記述)

ssh経由でコマンド実行

基本的には「ssh user@host command」を実行してその後パスワードを打てばリモート接続先でコマンドを実行することが出来ます。
user=hoge
host=192.168.0.2
command=/usr/local/bin/growlnotify test -m "こんにちは" -a test
ならば
ssh hoge@192.168.0.2 "/usr/local/bin/growlnotify test -m \"こんにちは\" -a test"
となります。エスケープを忘れずに!

ただ、これだと毎回パスワードを打つ必要があります(sshdでパスワードを必要としない設定にすればまあOKですが…)。メンドクセ

ログインを自動化する

 いろいろ調べてみるとUNIXコマンドの「expect」を使うといけるっぽいです。パスワードがhogehogeの時の具体的なシェルスクリプトは以下のとおりです。

#!/usr/bin/expect
set timeout 10
spawn ssh hoge@192.168.0.2 "/usr/local/bin/growlnotify test -m \"こんにちは\" -a test"
expect "Password:"
send "hogehoge\n"
interact

「expect "Password:"」のところは環境によって変わるかもです。「expect "assword"」とかにしたほうが汎用性があるかも…

でこのスクリプトを動かせば一応Growl通知は出たのですが必ず成功するわけではなく結構失敗します…
原因不明!これじゃなかなか使いづらいな

終わりに

今回はやや不満が残る結果に終わってしまいましたがexpectとか今まで知らなかったので勉強にはなりました。めでたしめでたし