ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

iPadへUSB経由でMac/NetWalkerからSSH接続

      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!

 - iPad, iPhone, Jailbreak, ガジェット