Pythonista3 for iphoneを使って簡単ssh port fowarding


用意するもの

  • sshサーバー
  • iphone
  • Pythonista3(IOS)

鍵の準備

RSA暗号で秘密鍵と公開鍵を作成します。Ed25519は非対応なので必ずRSA暗号で鍵を作ってください!!PythonistaにStaShが入っていない場合はインストールして下さい。StaShで次のコマンドを実行します。

$ ssh-keygen -t rsa -b 4096

"~/.ssh/"にid_rsa(秘密鍵)とid_rsa.pub(公開鍵)が生成されるはずです。作れたら公開鍵をsshサーバーに追加しておいて下さい。

sshtunnelのインストール

Pythonで作成されたsshtunnelというPort Fowardingが簡単にできるモジュールがあります。StaShで次のコマンドを実行してインストールします。

$ pip install sshtunnel

ここで、sshtunnelを少し修正します。sshtunnelはparamikoというモジュールに依存しているのですが、バージョンの食い違いでそのまま使うとエラーが出ます。PythonistaメニューのPython Modulesからsshtunnel.pyを探し出して次のように修正します。

1021> if host_pkey_directories is not None:
1022>   paramiko_key_types = {'rsa': paramiko.RSAKey,
1023> 'dsa': paramiko.DSSKey,
1024>-'ecdsa': paramiko.ECDSAKey,
1025>-'ed25519': paramiko.Ed25519Key}
1024>+'ecdsa': paramiko.ECDSAKey}

...

1215> for pkey_class in (key_type,) if key_type else (
1216>   paramiko.RSAKey,
1217>   paramiko.DSSKey,
1218>-  paramiko.ECDSAKey,
1219>-  paramiko.Ed25519Key
1218>+  paramiko.ECDSAKey
1220> ):

-の行を消して+の行を追加して下さい。

プログラムの作成

sshtunnelを使ってポート転送するプログラムを書きます。

from sshtunnel import SSHTunnelForwarder

server = SSHTunnelForwarder(
    ('sshサーバーアドレス', sshサーバーポート),
    ssh_username='ユーザー名',
    ssh_pkey='秘密鍵の場所',
    remote_bind_address=('リモート側アドレス', リモート側ポート),
    local_bind_address=('ローカル側アドレス', ローカル側ポート)
)

server.start()
input()
server.stop()

例えば次のように作成します。

from sshtunnel import SSHTunnelForwarder

server = SSHTunnelForwarder(
    ('server_ip', 22),
    ssh_username='user',
    ssh_pkey='~/.ssh/id_rsa',
    remote_bind_address=('127.0.0.1', 8000),
    local_bind_address=('127.0.0.1', 8000)
)

server.start()
input()
server.stop()

適当な場所にこのコードを作成して実行すればポート転送出来ます(iphoneの仕様上、バックグラウンドで動作するのは10分間だそうです)。Pythonistaは作成したプログラムのショートカットをホーム画面に追加する機能があります。作成しておけばワンクリックで実行できます。