概要
※※普段からtmuxでデタッチ/アタッチしてる人は読まなくて大丈夫かも※※
ssh越しにiTerm2のtmux統合を使うと、リモートのtmuxが手元のMacのiTerm2上でネイティブに動作しているように動きます。
また、普段のtmuxと同じようにデタッチしてアタッチすることも可能なので、MacBookなどで気軽にノートを閉じてssh接続を気軽切ってしまっても途中から再開できるようになります。
デタッチして切断してアタッチまでを動画にしました。
iterm2 ssh越しのtmux統合 pic.twitter.com/PyU0D1WZas
— 山崎 (@yamasaki0) March 2, 2020
利点
iTerm2のtmux統合の利点は https://www.iterm2.com/documentation-tmux-integration.html に説明がありますが、
翻訳を載せておきます。
通常、tmuxを使用すると、複数の仮想ウィンドウが単一の「物理」ウィンドウに表示されます。tmuxにコマンドを発行して、環境を操作できます。これにはいくつかの問題があります。
- コマンドモードに入るには、一部のキーストロークをtmux専用にする必要があります(^ B、デフォルトでは、emacsまたは対話型シェルでカーソルを左に移動することは難しくなります)。
- tmuxセッションのウィンドウの複数のビューを取得するには、リモートホストに複数回sshする必要があります。
- tmuxコマンドを学ぶ必要があります。
- 分割ペインを調整するには、マウスのレポートを有効にする必要があります。
- ターミナルエミュレータの一部の組み込み機能は、tmuxを使用していない場合と同じように機能しません。たとえば、通常のターミナルウィンドウでは、tmuxのスクロールバック履歴に簡単にまたはすばやくアクセスできません。また、tmuxの検索機能は、iTerm2の検索機能ほど優れていません。
多くのユーザーにとって、ターミナルマルチプレクサーは優れた動作方法ですが、欠点を受け入れたくありません。
iTerm2のtmux統合はこれらの問題を解決します。
tmux -CC
を実行すると、新しいtmuxセッションが作成されます。iTerm2ウィンドウが開き、通常のiTerm2ウィンドウのように機能します。違いは、iTerm2が終了するか、sshセッションが失われると、tmuxが実行し続けることです。sshされたホストに戻り、tmux -CC attach
を実行すると、iTerm2ウィンドウが以前と同じ状態で再び開きます。いくつかのユースケースが思い浮かびます:
ほとんどの作業をsshで行うユーザーの場合:
- 家に帰ったときに職場で持っていた環境を復元します。
- システムアップデートの再起動を心配する必要はもうありません!
すべての人のために:
- 2人が同じtmuxセッションにアタッチすることにより、別のユーザーと共同作業します。
必要なソフト
- 手元のMac
- リモートのLinux
- tmux 3.2-rc3 (ver3.1ではtmux統合に不具合があり正常に動作しませんでした)
設定
iterm2
-
Preferences -> General -> tmux
チェックボックス3つとも有効にする。
Open tmux windows as:
はNative tabs in a new windows
に設定する。
-
Preferences -> Profiles -> General
のCommandにssh -A -t <接続ホスト名> 'tmux -CC new -A -s main'
を記載する
-
Preferences -> Advanced -> Experimental Features
Allow variable window size in tmux integgration
をYes
に。
tmux
リモートLinux側の ~/.tmux.conf
へ以下の設定を入れることでtmuxウィンドウのタイトルをiTerm2タブ/ウィンドウのタイトルとして表示される
set-option -g set-titles on
set-option -g set-titles-string '#T'
ssh再接続時のagent forwardのsocketファイルををなんとかする
ssh先のtmuxでssh-agentの接続が切れてしまう問題の回避する
リモートLinux側の .bashrc
へ以下を追加することで、再接続にtmuxでもssh agent forwardingが正常に動作するようになる
[[ $SSH_AUTH_SOCK != $HOME/.ssh/sock && -S $SSH_AUTH_SOCK ]] \
&& ln -snf "$SSH_AUTH_SOCK" "$HOME/.ssh/sock" \
&& export SSH_AUTH_SOCK="$HOME/.ssh/sock"