🏄やりたいこと
🔭 tmux
をSSH接続後に自動起動させる方法について
クライアント側からやる方法と、サーバー側でやる方法の2通り。
クライアント側を推奨。
サーバー側での設定が非推奨の理由 うっかり設定を間違えてSSH接続が不可能になり死んだ、という悲劇が起こり得るため。あと、SSH接続を使うツール(Ansible とか)で不具合が出たときが面倒(クライアント側なら別の ssh_config を参照させればいいだけなので修正が簡単)。
|
🌟クライアント側でやる場合(推奨)
ssh_config
の設定に追記するだけで達成できる。
以下のように、SSH接続後にリモート側で実行するコマンドを指定する RemoteCommand
プロパティを設定すればいい。
Example 1. クライアント側
~/.ssh/config の例
Host raspi
HostName 192.168.1.10
User pi
Port 2222
IdentityFile %d/.ssh/id_ed25519
+ RequestTTY yes (1)
+ RemoteCommand tmux new-session -A -s %r (2)
1 | ssh の --tty オプションと同じく、常に疑似 TTY を要求する。この設定がないと open terminal failed: not a terminal エラーが発生する。 |
2 | リモートログイン後に実行するコマンド。 ここでは tmux を利用するコマンドを指定。 |
Command | Desc |
---|---|
new-session |
新規セッションを作成。 |
-A |
既存のセッションがあれば接続し、新規作成はしない。 |
-s |
セッション名を指定。 |
%r |
リモートユーザー名を表す。 |
あとは通常通りにSSH接続すれば、tmux
が起動された状態になる。
またデタッチするとSSH切断される。
😕サーバー側でやる場合
~/.profile
ファイル[3]に以下のようなスクリプト文を追記すればいい。
Example 2. サーバー側
tmux
のセッション内ではなく、SSH接続中であり、対話的なシェル(インタラクティブモード)であれば tmux
を起動する。
サーバー側で tmux 自動起動の設定
tee -a ~/.profile <<'EOF'
# Auto start tmux when SSH connecting
if [ -z "$TMUX" ] && [ -n "$SSH_TTY" ] && [[ $- =~ i ]]; then (1) (2) (3)
tmux new-session -A -s "$USER"
fi
EOF
1 | [ -z "$TMUX" ] : tmux のセッション内でなければ真。 |
2 | [ -n "$SSH_TTY" ] : SSH接続中であれば真。 |
3 | [[ $- =~ i ]] : bash が対話的なシェルであれば真。 |
[[ $- =~ i ]]
について補足
PS1 is set and $- includes i if bash is interactive, allowing a shell script or a startup file to test this state.
— Debian Manpages
bash(1) — bash — Debian buster
bash(1) — bash — Debian buster
とうことらしい。
よって、$-
に i
文字が含まれているか調べる [[ $- =~ i ]]
が真ならば対話的なシェルだと判別できる。
authorized_key ファイルにおいて、command オプションを使うことでも実装できるらしい。
|
自動化できて快適!🤗