如何阻止ssh重命名tmux窗口

less than 1 minute read

在使用tmux多窗口终端时,每次登录学校的服务器后,窗口的标签就会被改成与服务器的prompt相同。而且登出后也不会改回来,导致tmux经常几个窗口的名字都很长,也没有反映窗口当时的状况。之所以会这样,是因为tmux默认允许一些进程修改窗口名,而ssh对终端窗口的命名规则是由服务器上的配置文件决定的。

解决该问题的基本想法有三种:

  1. 在服务器端修改ssh对窗口的命名规则。但是这种办法显然无法应对多台服务器的情况。
  2. 在tmux的设置中完全禁用重命名。但是这样一来需要手动重命名的时候也无法实现。
  3. 重载ssh命令,加入需要的功能。

我采用的是第三种方案。顺便借此机会熟悉了一下bash的编程语法。以下代码是对chimay在superuser中提供的答案的改写。

ssh() {
    local code=0
    local ancien
    if [ $TERM = screen -o $TERM = screen-256color ]; then
        ancien=$(tmux display-message -p '#W')
        command ssh "$@"
        code=$?
        tmux rename-window $ancien
    else
        command ssh "$@"
        code=$?
    fi
    return $code
}

其中变量code=$?用于返回ssh可能收到的状态返回值,比如需要报错的情况。ancien用于记录登录ssh之前窗口的名称。 command用于表示执行系统原本的ssh命令,避免调用定义本身导致无限循环!"$@"表示将所有参数作为整体传入ssh命令。和原作者提供的版本相比,我将tmux相关的命令都放在if then的包裹中,避免在非tmux环境下的错误。这样一来,每次在登出服务器之后,tmux都会把窗口改回登录前的名字。