Takayama Fumihiko | Email: <tekezo@pqrs.org> | Google+

Mac OS X で daemontools を使って ssh トンネルや ssh socks を張る

目次

ユーザー権限で daemontools を起動する

ラッパーアプリケーション

icon.png login.png

daemontools-wrapper.zip
(daemontools のためのラッパー)

これは [Mac OS X] シェルスクリプトとかの CUI アプリケーションを Mac OS X 方式の .app にする方法 [簡単 5 ステップ] の応用ネタです。

まとめると、シェルスクリプトを .app 形式にすると Dock から「ログイン時に起動」が選択できてお手軽だねという。

daemontools とは

daemontools はサーバプログラムを自動起動するためのプログラムです。 そして、起動したプロセスを監視し続け、たとえプロセスが突然死しても自動的に再起動してくれます。

daemontools 自体のインストールは MacPorts で一発なので簡単です。

% sudo port install daemontools

クセがあるので、動作について理解するまで慣れがいるかもしれませんが、 単機能のプログラムなので一度覚えてしまえば使うのも簡単です。

【参考リンク】

活用例

daemontools に ssh のトンネルや ssh socks の起動をまかせています。

こうすると、 ssh の起動に失敗したときや、ネットワークが切断されたときも daemontools による自動再起動が行われるので、 トンネルの状態を気にする必要が無くなります。

ちなみに ssh socks を使うと、アクセス制限がかかっていたり LAN 内にあったりして、直接アクセス出来ないサーバに対しても、踏み台を利用して透過的にログインすることが可能になります。

問題点

daemontools を使うためには最初に svscan を実行する必要があります。

システム全体に影響するものであれば /etc/rc.local に書けば良いと思いますが、 個人的な ssh トンネルを張るための daemontools を /etc/rc.local に書くのはちょっと……。

crontab の @reboot を使えば良いのですが、 crontab は環境移行時に抜け落ちやすい項目 No.1 なので気が引けます。 テストも面倒です。

svscan の実行は Dock の「ログイン時に起動」を使用することにします。

[Mac OS X] シェルスクリプトとかの CUI アプリケーションを Mac OS X 方式の .app にする方法 [簡単 5 ステップ] の方法で svscan を起動する .app を作って、ログイン時に起動するようにすれば OK。

login.png

実際の .app

daemontools-wrapper.zip

使い方

1) MacPorts から daemontools をインストールします。

2) DaemonTools.app を適当な場所にコピーします。 (/Applications とか ~/Applications)
その後、Dock に DaemonTools.app を入れて「ログイン時に起動」するようにします。

3) ~/unix/service を作って、unix/service/svscan.sh をコピーします。

$ mkdir ~/unix/service
$ cp unix/service/svscan.sh ~/unix/service

4) ~/unix/service 以下に daemontools 用のプログラムを置いていきます。 以下のような感じになります。

$ find ~/unix/service
~/unix/service/ssh-socks-gardenia
~/unix/service/ssh-socks-gardenia/run
~/unix/service/ssh-tunnel-irc
~/unix/service/ssh-tunnel-irc/run
~/unix/service/ssh-tunnel-pop3
~/unix/service/ssh-tunnel-pop3/run
~/unix/service/ssh-tunnel-smtp
~/unix/service/ssh-tunnel-smtp/run
~/unix/service/svscan.sh

ssh トンネルや socks の書き方

ssh のトンネルの run は以下のようになります。
(gardenia.tkym.org の 10025 番ポートをローカルの 20025 に持ってくる)

#!/bin/sh

exec /usr/bin/ssh -oNumberOfPasswordPrompts=0 -N -L 20025:localhost:10025 tekezo@gardenia.tkym.org

ssh で socks するには

#!/bin/sh

exec /usr/bin/ssh -oNumberOfPasswordPrompts=0 -N -D 1080 tekezo@gardenia.tkym.org

一口メモ

Dock から起動できる .app の場合、特別な対策をしないと 2 重、3 重の起動が可能になります。

svscan が複数起動すると面倒なので、DaemonTools.app では svok で二重起動を防いでいます。

svdir=`dirname $0`
for d in $svdir/*; do
    if [ -d "$d" ]; then
        svok "$d" && exit 1
    fi
done

Date: 2007-07-17 15:00 (UTC)