ssh + iTerm2 tmux統合で切断しても再開できるリモート環境を作る


# 概要
**※※普段からtmuxでデタッチ/アタッチしてる人は読まなくて大丈夫かも※※**


ssh越しにiTerm2の[tmux統合](https://www.iterm2.com/documentation-tmux-integration.html)を使うと、リモートの**tmux**が手元のMacの**iTerm2**上でネイティブに動作しているように動きます。
また、普段のtmuxと同じようにデタッチしてアタッチすることも可能なので、MacBookなどで気軽にノートを閉じてssh接続を気軽切ってしまっても途中から再開できるようになります。

デタッチして切断してアタッチまでを動画にしました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">iterm2 ssh越しのtmux統合 <a href="https://t.co/PyU0D1WZas">pic.twitter.com/PyU0D1WZas</a></p>&mdash; 山崎 (@yamasaki0) <a href="https://twitter.com/yamasaki0/status/1234477438068936704?ref_src=twsrc%5Etfw">March 2, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 利点

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
  - [iTerm2 Build 3.4.1](https://github.com/gnachman/iTerm2/releases/tag/v3.4.1)
- リモートのLinux
  - [tmux 3.2-rc3](https://github.com/tmux/tmux/releases/tag/3.2-rc) (ver3.1ではtmux統合に不具合があり正常に動作しませんでした)

# 設定

### iterm2 
- **Preferences -> General -> tmux**
チェックボックス3つとも有効にする。
`Open tmux windows as:` は `Native tabs in a new windows`に設定する。
<img width="654" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26566/68038de2-052b-5890-bdae-50443fca2392.png">

- **Preferences -> Profiles -> General**
の**Command**に`ssh -A -t <接続ホスト名> 'tmux -CC new  -A -s main'` を記載する
<img width="909" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26566/20fd7430-e90a-8826-ec94-bbf4624d6446.png">

- **Preferences -> Advanced -> Experimental Features**
`Allow variable window size in tmux integgration`を`Yes`に。
<img width="1008" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26566/9e94e2c2-09bf-4dfa-869f-ceb2ffb832e0.png">



### tmux

リモートLinux側の `~/.tmux.conf`へ以下の設定を入れることで**tmux**ウィンドウのタイトルを**iTerm2**タブ/ウィンドウのタイトルとして表示される

```bash:~/.tmux.conf
set-option -g set-titles on
set-option -g set-titles-string '#T'
```

### ssh再接続時のagent forwardのsocketファイルををなんとかする

[ssh先のtmuxでssh-agentの接続が切れてしまう問題の回避する](https://qiita.com/yamasaki-masahide/items/cbf57c07ff21b4100056)

リモートLinux側の `.bashrc`へ以下を追加することで、再接続にtmuxでもssh agent forwardingが正常に動作するようになる

```bash:~/.bashrc
[[ $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"
```