多段ssh状態でjupyter notebookを使う話

先日、サークルの先輩から多段のssh接続をしている環境下でローカルからjupyter notebookを起動する方法を質問されたので、その時調べたものをまとめます。まあ、実践していないので 今度試すとき用のメモって感じ ですね。

多段sshの設定

ssh接続する際に勝手に踏み台サーバを経由してくれるように設定します。以下の設定はクライアント側で行います。

~/.ssh/configに設定ファイルがあるので、テキストエディタで編集(以下のコマンド)。[1]

$ vim ~/.ssh/config

テキストエディタで~/.ssh/configを開いたら以下のように編集します。

Host fumidai Hostname (踏み台サーバのip) User (接続時のユーザ名) FowardAgent yes Host main(ここの名前は後で使用しますのでなんでもOKです) Hostname (接続サーバのip) User (ユーザ名) ProxyCommand ssh -W %h:%p fumidai

このように編集することにより、mainに接続する際に自動的にfumidaiが経由され、踏み台時には9行目のProxyCommandに書かれたコマンドが実行されることになります。なお9行目における%hはホスト名、上記の場合はmainが、pはポート番号が入り特に指定しなければ22になります。ただし、今回はjupyter notebook側で指定したポート番号を指定することになります。

これで設定は完了です。接続する際には

$ ssh -f main(これは先ほどHostに書いた名前) -L 8888:localhost:8888 -N

とコマンドを打つと行けると思います。

jupyter notebook 側の設定

jupyter notebookをlocalhost以外から接続できるようにサーバ側で設定を行います。以下の作業はサーバ側で行います。

1 jupyter notebookのパスワード設定

パッケージ4.3からはセキュリティが強化され、jupyter notebookに接続する際にはパスワードを求められるようです。[2]このパスワードの確認は以下のようにインタプリタで確認します。

$ ipython
In [1]: from notebook.auth import passwd
In [2]: passwd()
Enter password: 
Verify password: 
Out[3]: 'sha1:...' # これをコピーしておく

2 コンフィグファイルを作成

jupyter notebookは次のファイルに作成します。pythonファイルなのが面白いですね。

$ mkdir ~/.jupyter
$ cd ~/.jupyter
$ vim jupyter_notebook_config.py

中身は以下のように設定します。なお、ポート番号は接続の際に使用するので適切に設定してください。

c = get_config() c.NotebookApp.ip='*' # 任意のipアドレスからアクセス可能(セキュリティ的にやばそう) c.NotebookApp.password = 'sha1:...' # コピーしておいた文字列をペースト c.NotebookApp.open_browser=False # ブラウザは自動で開かない c.NotebookApp.port=8888 # サーバーのポートを適当に設定しておく

以上でサーバ側の設定は終了です。一度ログアウトして再度接続します。

jupyter notebookの起動

先ほどの方法でローカルからサーバに接続します。なお、ポートは先ほどコンフィグで設定したものを利用します。

ssh -f main(これは先ほどHostに書いた名前) -L 8888:localhost:8888 -N

サーバでjupyer notebookを起動します。この時、

...(省略)
[I 21:34:44:918 NotebookApp] The Jupyter Notebook is running at:
[I 21:34:44:918 NotebookApp] http://localhost:8888

みたいな表示が出るらしいのでローカルから表示されたアドレスに接続して完了です。その際、パスワードを求められるようですが、先ほど表示させたものを入力します。


  1. vim
    vimはテキスト編集アプリなので、インストールされていない場合はviでもemacsでもOS標準のやつでもなんでも大丈夫です。 ↩︎

  2. https://jupyter-notebook.readthedocs.io/en/latest/security.html#server-security ↩︎