OS Xでシェルスクリプトをアプリケーション化する2009/06/19 15:54

特定のIPアドレスに対してだけデフォルトゲイトウェイではないルータをゲイトウェイに指定するためにスタティックルートを追加することは、日常ありふれたことではないが、特定の関係先や協力会社などとの接続のために利用することがないわけではない。

こういった場合では、通常デフォルトゲイトウェイのルータにその設定を施すことが普通だが、今回の案件では特定の利用者が使用する端末以外からは、そもそもこの裏口に到達させたくないので、特定の端末にだけスタティックルートを切ることになった。

Linux なら追加した経路情報は再起動してもそのまま有効だし、Windows でも route add コマンドに print オプションを追加してあげれば覚えさせることができる。ところが、ターゲットの端末はすべて OS X 10.5 の Macintosh である。困ったことに OS X の route コマンドの場合、再起動をかけると追加した経路情報をきれいさっぱり忘れてくれる。覚え込ませる機能が備わっていない。

このこと自体はかれこれ4〜5年前、10.3あたりの頃から知っていたが、その頃の Apple のサポート情報には「今のところはrc.common だったかの中に経路情報を追加するスクリプトを追加してしのいでください」といった、昔ながらのBSD風な対応策が紹介されていた。そのことが頭にあったので今回あらためてそのドキュメントを探したが見つけることができなかったし、10.4以降、システム起動時にプロセスを自動起動させる方法が rc スクリプトではなく /Library/StartupItems/ というディレクトリの下に個々の起動スクリプトを配置する方法に変更されているため、かなりやり方が変わってしまった。(Linux の /etc/init.d/ のやり方とよく似ている)

経路情報追加のスクリプトなんてそれこそ1行だけですむ話なのだが、一緒に記述しなければならない StartupParameters.plist という奴の記述方法がよくわからない。BSDでずっとやってきていて、このスタイルの変化にも対応してきた人々にとっては何でもないことなのかもしれないが、普段馴染みのない内容なので、あせって色々検索して試行錯誤してみたがどうも上手くいかない。何度書き直しても「記述内容に間違いがある」ために起動させることができない。
(このあたりについてはMAC OS XでのOS起動時の自動起動その他を参考にした)
しかたないので、シェルスクリプト自体をアプリケーション化して、個々のユーザに配布することにした。

これも以前だったらApple Script で Do shellscript ... とでも書くのだろうが、最近ではAutomatorというロボット君が提供されていて、「スクリプトを実行」というアクションが用意されていた。このアクションのパラメータとして sudo route add xxx.xxx.xxx.0/24 yyy.yyy.yyy.yyy と書いて「アプリケーションとして保存」を選べばいいことがわかった。

この点についても sudo がミソで、sudo なしだとパーミッションエラーでエラーになる。しかしこれも変な話なのだが、Automator で作った sudo つきのスクリプトではパスワード入力が不要なのである。ターミナルを開いてこのスクリプトを実行すれば、システムの設定をいじる命令なので当然パスワードを訊いてくる。それなのに Automator で作った場合には四の五の言わずに黙って実行してくれる。これはセキュリティ的にどうなんだろうかといささか疑問が残った次第である。

それはそれとして、アプリケーションで対応といった当座の妥協策で放置しておくのもおもしろくないので、継続して追いかけてなんとかするつもりではある。

OS Xでシェルスクリプトの起動項目化成功!2009/06/19 17:34

ついさっきのエントリ(OS Xでシェルスクリプトをアプリケーション化する)では経路情報の追加を起動時に自動で実行させる試みに頓挫して、アプリケーション化でお茶を濁したと書いたが、どうにも煮え切らない思いだったのであらためてヒントになる情報がないかググって探してみたところ、Mac OS Xの起動の仕組みという名古屋大学の内藤さんという方がOS XBetaの頃に書かれたページが引っかかった。

ここに書かれていた内容を参考にしてあらためてStartupParameters.plistの中身をXMLではない古いスタイルで書き直してみたところ、書式エラーは出なくなった。

しかしそれでもスクリプトの実行自体は fail してしまう。

もう一度あらためてスクリプトを眺めること5分。なんのことはない、1行目の冒頭 #!/bin/sh で始めなければならないのに、#が抜けてる orz .... しかし、きちんと#を補って SystemStarter start してみたところ無事経路の追加に成功。

さっきのエントリでは10.4の頃から変更になったと書いたけれど、2001年のBeta時代からしっかりと移行は始まっていたんですね。まぁこれでひと安心です。ありがとうございました内藤先生 m0m