私は通常sshを使用して接続するリモートサーバーを持ち、接続後にbyobuが自動的に起動します(スクリプトを使用して設定された.profileの行を介してbyobu-enable
)。それでは、リモートのjupyterノートブックを使用するために同じサーバーに接続するときに別のワークフローを設定したいと思います。リモートサーバーがjupyterを起動し、sshにポートをjupyter
クライアントシステムに転送させたいと思います。私はローカル.ssh/configに追加しました。
Host remote-server-jupyter
HostName 123.45.6.789
User pgcudahy
LocalForward 8889 localhost:8889
ServerAliveInterval 30
ServerAliveCountMax 3
RemoteCommand cd ~/Projects && jupyter notebook --no-browser --port=8889
問題は、「RemoteCommand」がbyobuの起動を妨げるため、コマンドを接続して実行した後は、クールなマルチプレックス画面の代わりにプレーンテキストシェルが残るということです。接続中にbyobuとリモートコマンドの両方を取得する方法は?
重要なことは、特定のワークフローが必要であると指定しない限り、すべての接続でこれらのコマンドを実行したくないことです。明らかにbyobuに接続してからサーバー上でスクリプトを実行してワークスペースを設定できますが、これらすべてをクライアントで1つの自動化されたコマンドでラップしたいと思います。より良いことは、カスタムコマンドを実行するだけでなく、複数のウィンドウと各ウィンドウに異なるコマンドを持つカスタムbyobuワークスペースを設定する別の設定ファイルを持つことです。
答え1
答えの核心はこのスタックオーバーフローの質問。ssh
-t
対話型疑似端末を開くには、このフラグを使用します。その後、コマンドをbyobuセッションにbyobu new-session
渡します。byobu send-keys
まず、.ssh/configを作成します。地元のマシンはSSH接続を確立します。
Host remote-server-jupyter
HostName 123.45.6.789
User pgcudahy
LocalForward 8889 localhost:8889
ServerAliveInterval 30
ServerAliveCountMax 3
次に、ホームディレクトリにスクリプトを配置します。離れてbyobuセッション用のマシンを設定します。 "jupyter"セッションが作成されたかどうかをテストするには、コマンドリストではなくスクリプトが必要です。名前をremote-jupyter-startup.shとして指定しました。
#!/bin/bash
# Test if there's a 'jupyter' session already set up
if [ -z "$(byobu list-sessions | grep jupyter)" ]
# If not, then set up the session
then
# Create a new detached session named 'jupyter'
byobu new-session -d -s jupyter
# Pass a 'cd' command to the session, then 'C-m' to execute
byobu send-keys -t jupyter 'cd ~/Projects' 'C-m'
# Pass the 'jupyter' command to the session, then 'C-m' to execute
byobu send-keys -t jupyter 'jupyter notebook --no-browser --port=8889' 'C-m'
# Create a second window in the session
byobu new-window -t jupyter:1
fi
# Attach to the session
byobu attach-session -t jupyter
実行可能にする
chmod +x remote-jupyter-startup.sh
今地元の私が運転できる機械
ssh remote-server-jupyter -t "./remote-jupyter-startup.sh;"