冗長な記憶の断片

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

AcceptEnv LANG LC_* TMUX

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

sshd.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
---
- 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