Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新(準備中)

Jan 31, 2021 - コメント - 日記

tmuxをネストして起動しない

リモート環境だけでなくローカル環境でも tmux を使っていて、リモート環境でうっかり tmux を起動するとローカルの tmux の中に入れ子でリモートの tmux が起動します。この状態だとすべての tmux がプレフィクスが外側(ローカル側)に捉えれてしまって内側(リモート側)の tmux が制御不能となります。これを防ぐために、内側の tmux プレフィクスのキーバインドを変えるという方法 もあるのですが、操作が複雑で誤動作も多くなるのでもういっそ tmux から tmux を起動した場合は起動を抑制するようにしようと思います。

やり方は簡単で tmux には元々ネスト起動を防ぐために$TMUX環境変数が定義されていたら起動しないような動作をします。しかしながら、ssh で接続したときにはこの環境変数が ssh クライアントから ssh サーバに渡らないためネストが発生します。

従って解決方法は ssh 接続先に$TMUXを渡すということになります。このためには ssh サーバ/クライアント両方の設定が必要です。

ssh(クライアント側)の修正

~/.ssh/configの設定にSendEnvを追加します。

Host *
  SendEnv TMUX

sshd(サーバ側)の修正

sshd の設定ファイルを修正します。

/etc/ssh/sshd_config

1
AcceptEnv LANG LC_* TMUX

変更するサーバがいっぱいあって大変だったので Ansible の Playbook を書きました。

sshd.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
---
- hosts: all
  tasks:
    - lineinfile: dest='/etc/ssh/sshd_config'
        state=present
        regexp='/^AcceptEnv/'
        line='AcceptEnv LANG LC_* TMUX'
      become: yes
      register: sshd

    - service:
        name: sshd
        state: restarted
      become: yes
      when: sshd.changed

以下のようにして実行してください

1
$ ansible-plabyook -i server1,server2,server3, sshd.yml