tmux – ssh接続先をtmuxのペインに表示する

昔使っていた.tmux.confが失われてしまったため、新しいものを作っていく。
不要な機能が満載になっていたので、これを機に必要なものだけ設定する。

複数の鯖にsshで繋ぐと、ssh接続のペインだらけになり、間違えて操作してしまうことが多い。
その対策として、ssh接続ごとにペインの背景の色を変えていた。
結局、間違えるときは色を変えたところで間違えるため、デザインがケバくなるだけで無意味。

ペインに接続先ホスト名を表示するぐらいがちょうど良い感じだと思う。
こちらの完成度が超絶高いので使うことにしてみた。
ホスト名が強調されたりするともっと良いのだけれども。

SSH接続先のホスト名をtmuxのペインに表示する(大事件)


#!/bin/zsh

#/usr/local/bin/tmux-pane-border
if [[ $1 = "ssh" ]]; then
  pane_pid=$2
  info=$({ pgrep -flaP $pane_pid ; ps -o command -p $pane_pid; } | xargs -I{} echo {} | awk '/ssh/' | sed -E 's/^[0-9]*[[:blank:]]*ssh //')
  port=$(echo $info | grep -Eo '\-p ([0-9]+)'|sed 's/-p //')
  if [ -z $port ]; then
    local port=22
  fi
  info=$(echo $info | sed 's/\-p '"$port"'//g')
  user=$(echo $info | awk '{print $NF}' | cut -f1 -d@)
  host=$(echo $info | awk '{print $NF}' | cut -f2 -d@)

  if [ $user = $host ]; then
    user=$(whoami)
    list=$(awk '
      $1 == "Host" {
        gsub("\\\\.", "\\\\.", $2);
        gsub("\\\\*", ".*", $2);
        host = $2;
        next;
      }
      $1 == "User" {
      $1 = "";
        sub( /^[[:space:]]*/, "" );
        printf "%s|%s\n", host, $0;
      }' ~/.ssh/config
    )
    echo $list | while read line; do
      host_user=${line#*|}
      if [[ "$host" =~ $line ]]; then
        user=$host_user
        break
      fi
    done
  fi
  ssh_hostname=" ssh:$user@$host "
fi

echo $ssh_hostname


# .tmux.conf
set-option -g pane-border-status bottom
set-option -g pane-border-format "#P #(tmux-pane-border #{pane_current_command} #{pane_pid})"

上記のサイトの通り、各ペインのセッションがsshであればペインのボトムにhostnameを表示している。
sshコマンド自体に手を入れたくないので、process listをポーリングするやり方に賛同します。

次回はシステムのクリップボードコピー。