SBSettings ScriptyでSSHポートフォワードトグルを作った

自鯖の管理画面(webminとかmrtgとか)は、外部公開せずにsshポートフォワードをしてからいつもアクセスしてます。
PCからだったら別に問題ないんだけど、iPhoneから見たい場合にSSHトンネリングしなきゃいけない。
けど、有料App買うのも嫌だし、いちいちMobileTerminalから打つのもめんどくさい。
というかSBSettingsでトグルしたい。

Macで開発環境があればそれで作っちゃえばいいんだろうけど、
Windowsしか無いんでmoyashiさん謹製「SBSettings Scripty」を使って作りました。

http://hitoriblog.com/?p=2620

基本的な作り方は本家に書いているので、自分が作った部分だけメモ。

準備

SBSettings Scripty

これが無いと始まらないのでCydiaでインストールする。

MobileTerminal

http://code.google.com/p/mobileterminal/downloads/list
ここから最新のdebを拾ってきて、iPhoneに転送してiFileでインストール

rootパスワード変更

基本。SSHd入れてないからまだやってなかった。

OpenSSH

Cydiaから。

BigBoss Recommended Tools

作業に便利なんでCydiaから入れる。

Vi IMproved

同じく便利なんで入れる。

SSHの接続設定を作る

/private/var/root/.ssh/config

Host hoge
    HostName exsample.com
    User piyo
    IdentityFile ~/.ssh/id_piyo
    LocalForward 8080 localhost:8080
    LocalForward 10000 localhost:10000
    LocalForward 3306 localhost:3306

鍵認証させるんで、鍵ファイルは~/.ssh/に設置。
この時点でTerminalから

ssh piyo

こんな感じで接続できることを確認しておく。

/private/var/mobile/Library/SBSettings/Toggles

本家の指示通りに、SBSettings Scriptyをインストールした時点で入っているScripty1を流用する。

ディレクトリ作成

/private/var/mobile/Library/SBSettings/Toggles
以下に「hoge.connect」という名前で作成。

Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>ScriptyId</key>
    <string>hoge.connect</string>
    <key>ShouldTransitionOut</key>
    <false/>
    <key>HasStatus</key>
    <true/>
    <key>DelayTime</key>
    <integer>0</integer>
    <key>AllowInCall</key>
    <false/>
</dict>
</plist>

Toggle.dylibはそのままコピー。

/private/var/mobile/Library/SBSettings/Commands

実際のスクリプトを設置する部分。
以下、hoge.connectはInfo.plistでScriptyIdで記述したものに合わせる

hoge.connect-launch-when-decision-state

トグルの状態を決定するスクリプト
exit 1でon、exit 0でoffになる。

#!/bin/sh

ps ax | grep "[s]sh hoge -N" > /dev/null

if [ $? -eq 0 ]; then
        # ssh is running -> toggle state on
        exit 1
else
        # ssh is not running -> toggle state off
        exit 0
fi

sshが起動しているか調べる。
twitterでmoyashiさんが直々に教えてくださったのでほぼ流用。

hoge.connect-launch-when-toggle-is-off

トグルがoffの時に動くスクリプト

#!/bin/sh

killall ssh
ssh hoge -N &

killallはいらないかも知れないけれど、念のため入れてみた。
あと、sshコマンドの部分の最後の&を入れてなくて、何度やってもトグルoffにできなくてハマる。
"-launch-when-toggle-is-off"が動いたままになってると、"-launch-when-toggle-is-on"は動かないみたいですね。

hoge.connect-launch-when-toggle-is-on

トグルがonの時に動くスクリプト

#!/bin/sh

#ps -ef | grep "[s]sh hoge -N" | awk '{print "kill -9",$2}'|sh
killall ssh

最初はコメント部分みたいにstateと同じように調べてkillしてたんだけど、変にプロセス残ったりしても嫌だし確実に殺すためにkillallにした。

その他

/private/var/mobile/Library/SBSettings/Themes

トグルの画像をつけたいなぁと思って、適当に検索してみつけた、
http://www.iconshut.com/application-icons/1187-toolbar-2-icons.html
この辺のアイコンを使って、on.pngとoff.pngを作成。

killall sbsettingsd

新しいScriptyトグルを作る手順の項に以下のような記載があります。

6. sbsettingsdをkillall:/var/mobile/Library/SBSettings/Commands/に追加したスクリプトをsbsettingsdに認識してもらう必要があるため、sbsettingsdをroot権限でkillallする。「$ sudo killall sbsettingsd」

これは、最初だけでOKっぽいです。
一度これをやってsbsettingsdにスクリプト名を覚えさせておけば、sftpなんかで上書きした側から新しいスクリプトは有効になってたっぽいです。


というわけで、Mac無しに簡単なトグルの作成が出来てしまいました。
シェルスクリプトなんて殆ど知らなかったけどどうにかなった。
いろいろ遊べそうだなぁ、これ。

moyashiさん、本当にありがとうございました。

ところで、iPhoneMySQLフロントエンドについて

無料で入れられるやつを二つほど試してみたけど、
DB Tracklayer - TRACKSYSTEMS Co.,Ltd.
DataGlass MySQL - impathic
どっちもインストールは無料で、フルバージョンは\600。
制限バージョンだと見れるレコード数が少ない制約がある。

ちょっと使った感じだとDataGlassの方がいいかな。画面も見やすいし、UIは作りこまれてる。
ただ…日本語のローカライズが最低水準だけど…OKボタンが「[OK]を」とかになってるし…。
Appごとに言語を固定するようなJBAppってあったっけ…あるなら良いかもしれない。