SSH远程登录到另一台计算机后修复终端标题


18

现在,我正在使用单行perl代码来更改终端栏的标题,

print("\e]0;@ARGV\7");

但是每次我将SSH切换到另一台远程计算机后,主机都会修改标题(对此我并不特别烦恼)。但是,当我退出连接后,修改后的标题仍然保留。有没有办法来解决这个问题?从本质上讲,我希望在本地操作时为我的终端机定一个标题。

我主要在CentOS或Debian下使用xfce终端和终止符。谢谢。

编辑

另一个微妙之处在于,宁愿所有终端都具有相同的名称,我更希望能够自由地即时编辑其标题,但仅禁止SSH会话修改我编辑的内容。

Answers:


6

我不知道窗口标题,但是我一直试图让我的系统在终止ssh会话时做一些事情-实际上是在终止ssh会话之后。简而言之:它不是那样工作的。基本上,您有三个选择:

  1. 在ssh周围编写一个包装器,即一个名为$ 可执行文件,该脚本ssh优先/usr/bin/ssh于$ PATH,exec /usr/bin/ssh $@该文件的中间部分包含该行。这使您可以在有效ssh二进制文件运行之前和之后让shell做一些事情,同时将开销降到最低。

  2. 针对您选择的SSH源编写补丁程序,以提供清理钩子,该钩子执行通过命令行或某些配置设置传递的shell命令。那就是我们想要的。

  3. PROMPT_COMMAND评估的输出history。基本上是一种更通用,更丑陋的方法。


基本上,我只是编写了一个简单的脚本来获取当前标题,并在SSH会话之前将其保存,然后再恢复该标题。
nye17 2012年

4
@ nye17您可以张贴您使用的解决方案脚本吗?
Reg Mem 2014年

我在下面发布了我的解决方案脚本。应该是@ nye17做的非常匹配的事情。 unix.stackexchange.com/a/341277/112190
phyatt

7

解决方案: ssh和su命令之后添加一些功能〜/ .bashrc以执行某些操作

function title()
{
   # change the title of the current window or tab
   echo -ne "\033]0;$*\007"
}

function ssh()
{
   /usr/bin/ssh "$@"
   # revert the window title after the ssh command
   title $USER@$HOST
}

function su()
{
   /bin/su "$@"
   # revert the window title after the su command
   title $USER@$HOST
}

注意:编辑〜/ .bashrc后重新启动bash

例:

# title is "user1@boxA"
ssh boxB  # auto changes title while on boxB to "user1@boxB"
exit
# title returns back to "user1@boxA" because of our title call in ssh()
su - user2 # auto changes title while switched user to user2: "user2@boxA"
exit
# title returns back to "user1@boxA" because of our title call in su()

希望能有所帮助。


稍有不准确的说法,revert因为您不检查之前的内容即可...如果您查询并保存了先前的值tho ;-)
nhed

4

使用相同的机制,配置本地外壳点文件(例如$PROMPT_COMMAND中的~/.bashrc)以适当地设置终端标题。

例如:

export PROMPT_COMMAND="printf '\e]0;bash\7\n'"

1.提示命令与终端窗口的标题无关,对吗?我已经设置了hint_command,但仅用于提示。2.在退出ssh日志后,我仍然需要一种机制来记住并激活我的本地设置。
nye17 2012年

提示命令只是发出必要的转义序列,以便您的终端重命名其标题栏。:)
恢复莫妮卡2012年

但是我也希望可以自由地重命名我想要的任何终端,而不是让每个会话都具有相同的名称。实际上,我基本上是编辑终端标题手册,并希望即使在SSH登录/注销之后,终端也保持固定标题。是否有意义?
nye17 2012年

1
因此,然后将所需的标题放在变量中,然后输出。
伊格纳西奥·巴斯克斯

如果使用此终端转义序列设置空标题(例如export PROMPT_COMMAND="printf '\e]0;\7\n'"),则终端仿真器可以根据需要设置窗口标题。ssh到设置终端标题的远程主机时,终端仿真器将显示该标题,而注销时,它将恢复为使用自己的标题。至少,这就是macOS Terminal应用程序的工作方式。
claymation

3

将这些行添加到〜/ .bashrc

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"

    ;;
*)
    ;;
esac

与基于debian的linux一起很好地工作


1
它没有设置标题……
Bananguin 2014年

通常,使用它PROMPT_COMMAND而不是使用会更好PS1,因为您不必包括方\[ \]括号,并且可以消除一些引号。
克里斯·佩奇

2

一种解决方案是在ssh'ing之前将终端变量更改为vt100,例如运行

export TERM=vt100

之所以有效,是因为通常初始化脚本会查看终端变量,并且仅将其标题更改为xterm。您将失去备用的屏幕,颜色以及可能无法欣赏的其他精美功能。

如果要将本地终端保留为xterm,请使用别名ssh即时更改终端变量,例如

alias ssh='TERM=vt100 /usr/bin/ssh'

它改变了事物的显示方式。颜色未显示
npk

0

我通过将其添加到.bashrc文件中的PS1中来解决此问题。

\[\e]2;\u@\H:\w\a\]

因此,整个行看起来像这样(我已经自定义了我的PS !:

export PS1='\[\e]2;\u@\H:\w\a\]\n($LOGNAME@$HOSTNAME) \t\n[$PWD]: '

希望对别人有帮助。


如果使用此终端转义序列设置空标题(例如export PS1='\[\033]0;\007\]\h:\W \u\$ '),则终端仿真器可以根据需要设置窗口标题。ssh到设置终端标题的远程主机时,终端仿真器将显示该信息,而注销时,它将恢复为使用自己的标题。至少,这就是macOS Terminal应用程序的工作方式。
claymation

0

当我退出SSH时,其他答案对我不起作用,但使我与世隔绝。当我退出远程ssh会话时,添加setw自动重命名是可行的,因此它会自动重命名,而不必退出窗口即可重设。[Jan。2018-Debian 9]

ssh() {
tmux rename-window "$*"
command ssh "$@"
tmux setw automatic-rename
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.