如何阻止ssh重命名tmux窗口
在使用tmux多窗口终端时,每次登录学校的服务器后,窗口的标签就会被改成与服务器的prompt相同。而且登出后也不会改回来,导致tmux经常几个窗口的名字都很长,也没有反映窗口当时的状况。之所以会这样,是因为tmux默认允许一些进程修改窗口名,而ssh对终端窗口的命名规则是由服务器上的配置文件决定的。
解决该问题的基本想法有三种:
- 在服务器端修改ssh对窗口的命名规则。但是这种办法显然无法应对多台服务器的情况。
- 在tmux的设置中完全禁用重命名。但是这样一来需要手动重命名的时候也无法实现。
- 重载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都会把窗口改回登录前的名字。