iPadへUSB経由でMac/NetWalkerからSSH接続
2016/03/16
価値ある情報をユーザー視点で発信するブログ
2016/03/16
iPadをいじくるためにSSH接続をしまくるわけですが、現状だとiPadの純正Tetheringを有効にする手だてがないようで、Wi-Fi経由のSSHを余儀なくされます。
しかし、Wi-Fi経由だとモッサリと遅いので案配がよろしくありません。
どうにか純正テザリング以外の方法で、USB経由のSSH接続をしたいものです。
Linuxの世界にはiTunnelというものがあり、これでUSB経由のSSH接続が可能です。
$ sudo itunnel 3024 & $ ssh -p 3024 mobile@localhost
その発展系であるusbmuxdがUbuntu10.04に載るということで話題になってますが、かなり規模の大きいプロジェクトになっている一方、iTunnelは機能が単純な代わりに至極ソースコードがシンプルで、Mac OS Xでも動くとの記載があったのでMac OS X 10.6.4で動かしてみました。(続きは[MORE]から)
現在iTunnelをコンパイルをしようとして困るのが、libusbのバージョンの問題です。libusbは0.1系と1.0系ではヘッダのファイル名から関数名まで違います。普通にMacPortsから入るlibusbは1.0系列になるのですが、それだとiTunnelのコンパイルもリンクもできません。libusbの0.1系列に依存するソフトウェアと互換性を取るためにlibusb-compatというラッパーがあるので、それを併せて導入します。
$ sudo port install libusb libusb-compat
iTunnelの最終版0.0.9をダウンロード、解凍します。
$ wget http://www.cs.toronto.edu/~jingsu/itunnel/itunnel-0.0.9.tgz $ tar xvzf itunnel-0.0.9.tgz $ cd itunnel-0.0.9
MakefileをMacPortsのヘッダ、ライブラリを見るように修正します。また、Mac OS Xではlibrtを使用しないのでリンク指定を削除します。
--- Makefile.org 2010-06-27 16:39:25.000000000 +0900 +++ Makefile 2010-06-27 16:39:53.000000000 +0900 @@ -4,10 +4,10 @@ OBJS := $(patsubst %.c,%.o,$(wildcard $(SRCDIR)/*.c)) CC := gcc -CFLAGS := -Wall -g -O0 -I/usr/local/include/ +CFLAGS := -Wall -g -O0 -I/opt/local/include/ #LDFLAGS := -L/usr/local/lib -lpthread -lusb -lrt -liphone -LDFLAGS := -L/usr/local/lib -lpthread -lusb -lrt +LDFLAGS := -L/opt/local/lib -L/usr/local/lib -lpthread -lusb all: $(TARGET)</pre>
続いて、iphone.cの修正です。Mac OS Xには無いclock_gettime()をgettimeofday()に置き換え、また対象とするデバイスIDを0x1297からiPadの0x129aの範囲までに拡大します。
--- iphone.c.org 2009-09-02 22:52:56.000000000 +0900 +++ iphone.c 2010-06-27 16:50:30.000000000 +0900 @@ -279,7 +279,7 @@ for (bus = usb_get_busses(); bus != NULL; bus = bus->next) for (dev = bus->devices; dev != NULL; dev = dev->next) if (dev->descriptor.idVendor == 0x05ac - && dev->descriptor.idProduct >= 0x1290 && dev->descriptor.idProduct <= 0x1297) + && dev->descriptor.idProduct >= 0x1290 && dev->descriptor.idProduct <= 0x129a) return iphone_get_specific_device(bus->location, dev->devnum, device); return IPHONE_E_NO_DEVICE; @@ -607,7 +607,8 @@ uint32 blocksize = 0; if (client->wr_window <= 0) { struct timespec ts; - clock_gettime(CLOCK_REALTIME, &ts); + //clock_gettime(CLOCK_REALTIME, &ts); + gettimeofday(&ts, 0); //ts.tv_sec += 1; ts.tv_nsec += 750 * 1000; if (pthread_cond_timedwait(&client->wait, &client->mutex, &ts) == ETIMEDOUT) { @@ -928,7 +929,8 @@ if (timeout > 0 && (client->recv_buffer == NULL ||client->r_len == 0)) { struct timespec ts; - clock_gettime(CLOCK_REALTIME, &ts); + //clock_gettime(CLOCK_REALTIME, &ts); + gettimeofday(&ts, 0); ts.tv_sec += timeout; //ts.tv_nsec += millis * 1000; pthread_cond_timedwait(&client->wait, &client->mutex, &ts);
これでコンパイルすればiPad対応itunnelコマンドの出来上がりです。
MacBook-Pro:itunnel-0.0.9 stallman$ make gcc -Wall -g -O0 -I/opt/local/include/ -c -o iphone.o iphone.c iphone.c: In function ‘iphone_mux_send’: iphone.c:611: warning: implicit declaration of function ‘gettimeofday’ gcc -Wall -g -O0 -I/opt/local/include/ -c -o itunnel.o itunnel.c itunnel.c: In function ‘clientthread’: itunnel.c:189: warning: assignment makes pointer from integer without a cast itunnel.c:197: warning: assignment makes pointer from integer without a cast itunnel.c:258: warning: comparison between pointer and integer itunnel.c:261: warning: assignment makes pointer from integer without a cast gcc -Wall -g -O0 -I/opt/local/include/ -L/opt/local/lib -L/usr/local/lib -lpthread -lusb ./iphone.o ./itunnel.o -o itunnel
iPadとMacをUSBケーブルで接続し、以下のようにすればSSHでログインできるはずです。実行にはroot権限が必要です。当然のことながら、iPadはJailbreakをし、OpenSSHをインストールしてログインできる状態になっていなければなりません。同様に、iPhoneにもSSHでログインできると思います。
トンネル掘り(終了はCtrl-C):
MacBook-Pro:itunnel-0.0.9 stallman$ sudo ./itunnel 3024 get_iPhone() success - successfully got device server waiting for ssh connection on port 3024
別のターミナルからSSHでログイン:
MacBook-Pro:~ stallman$ ssh -p 3024 mobile@localhost iPad:~ mobile$ ls Applications/ Console/ DSDisplayController.cy* Documents/ GeekTool.cy* GoodReaderDocuments@ HelloApp/ HelloApp.zip HelloAppiPhone/ Library/ Media/ MobileSubstrate/ SBSettings/ SBSettingsHeaders/ TabBarSample/ TabBarSample.zip Terminal-426-unstable.zip com.hitoriblog.vmenabler_0.1-1_darwin-arm/ com.hitoriblog.vmenabler_0.1-1_darwin-arm.deb cycript/ delegate/ delegate9.9.7/ delegate9.9.7.tar.gz ipad-toolchain.deb notifyddump.cy* privoxy-3.0.16-stable-2/ privoxy-3.0.16-stable-2_darwin-arm-private-minimum.deb snipMate.zip wwwoffle-2.9f/ wwwoffle-2.9f.tgz iPad:~ mobile$
Wi-Fi経由と違い、非常に軽い。しかし、それなりに不安定な部分もあるようです。試行錯誤してみてください。
NetWalkerでも動作確認しています。
NetWalkerでは、以下のようにlibusb関係をインストールした後、iphone.cのデバイスIDのところだけいじれば、iPadとつながるitunnelコマンドが出来ると思います。
$ sudo apt-get install libusb-dev libusb-compat</pre>
それでは、Happy Hacking!