trzsz / trzsz-ssh

trzsz-ssh ( tssh ) is an ssh client designed as a drop-in replacement for the openssh client. It aims to provide complete compatibility with openssh, mirroring all its features, while also offering additional useful features. Such as login prompt, batch login, remember password, automated interaction, trzsz, zmodem(rz/sz), udp mode like mosh, etc.
https://trzsz.github.io/ssh
MIT License
1.68k stars 100 forks source link

关于提供登录后自动修改窗口标题的建议 #125

Closed Jabberworkkkk closed 1 month ago

Jabberworkkkk commented 2 months ago

我已经阅读过 #38 ,明白可以在linux类服务器上通过配置 .bashrc 文件自动修改标题。但对于各类非通用linux操作系统的网络设备,比如说各种专业网络交换机、路由器、防火墙...它们是无法这样配置的。因此,希望作者能在tssh的配置文件中提供一个选项,让每个连接的标题自动修改为 “ 用户名@IP ”的格式(前提当然是这个连接没有在ssh的配置中预先定义),希望作者能考虑一下,谢谢!

lonnywong commented 2 months ago

参考 个性配置,在 ~/.tssh.conf 中如下配置,应该就能满足你的需求了:

SetTerminalTitle = Yes
Jabberworkkkk commented 2 months ago

参考 个性配置,在 ~/.tssh.conf 中如下配置,应该就能满足你的需求了:


SetTerminalTitle = Yes

我看了下自己的 .tssh.conf 发现已经是这样配置了,就确认了一下情况,看来我一开始理解错了,情况应该是这样:对于没有在 .bashrc 里配置PROMPT_COMMAND的设备,tssh 在登录后会自动把标题改为设备的IP,但对于linux类服务器,PROMPT_COMMAND变量即使没有在 .bashrc 里自定义也会有一个默认值,在tssh登录后也会按照这个默认值来修改标题。之前对readme那理解的可能不是很对。 那么请问能否增加一个开关,让tssh忽略服务器上的PROMPT_COMMAND呢?对于自己管理的服务器来说,修改 .bashrc 是很容易的,但假设一位管理虚拟化平台的管理员,他有时候需要登录用户在虚拟化平台上创建的VM做些操作,但他直接去修改用户VM上的 .bashrc 有时并不合适。在这种情况下,如果tssh能增加一个开关允许无视服务器的 PROMPT_COMMAND值就会比较方便了。

lonnywong commented 2 months ago

PROMPT_COMMAND 只有含有类似 'echo -ne "\033]0;...\007"',才会修改标题。这个是服务器的输出,终端识别了这个输出,然后终端修改了标题。

要无视服务器的 'echo -ne "\033]0;...\007"',除非 tssh 修改服务器的输出,过滤掉所有修改标题相关的内容,别输出给终端,才可以。

lonnywong commented 2 months ago

修改服务器输出的做法,我觉得不是很好。不修改 .bashrc 等文件,也可以通过 自动交互 来自定义 PROMPT_COMMAND,如:

Host xxx
    #!! ExpectCount 1
    #!! ExpectPattern1 $
    #!! ExpectSendText1 export PROMPT_COMMAND='echo -ne "\\033]0;我的标题\\007"'\r
Jabberworkkkk commented 2 months ago

修改服务器输出的做法,我觉得不是很好。不修改 .bashrc 等文件,也可以通过 自动交互 来自定义 PROMPT_COMMAND,如:


Host xxx
    #!! ExpectCount 1
    #!! ExpectPattern1 $
    #!! ExpectSendText1 export PROMPT_COMMAND='echo -ne "\\033]0;我的标题\\007"'\r

这确实是一个办法。不过可能是我对bash shell不熟悉,研究了很久还是找不到能够完美在PROMPT_COMMAND里动态获得IP地址的方法,最接近的是下面这样:

  #!! ExpectCount 1
  #!! ExpectPattern1 ]
  #!! ExpectSendText1=export PROMPT_COMMAND='echo -ne "\\033]0;${USER}@${SSH_CONNECTION#* * *}\\007"'\r

效果如下: image

IP后面的端口号实在找不到方法去掉

lonnywong commented 2 months ago

笨方法是每个 Host 分别配置,写死 IP。

Jabberworkkkk commented 2 months ago

看来没什么特别好的解决办法,也只能这样了,感谢回复

lonnywong commented 2 months ago

可以考虑让 ExpectSendText 支持 ssh tokens,要改一下代码。 不过是破坏性的修改,原来的 % 要写成 %%,升级 tssh 之后,可能有些人的配置可以要修改。

Jabberworkkkk commented 2 months ago

我有个想法,提供一个开关,让标题可以显示为类似: [远程服务器IP]:由远程服务器PROMPT_COMMAND定义的字符串 即在标题栏前半部分固定显示IP,后半则正常显示PROMPT_COMMAND的内容,后果就是标题栏占空间要大一点

lonnywong commented 2 months ago

我有个想法,提供一个开关,让标题可以显示为类似: [远程服务器IP]:由远程服务器PROMPT_COMMAND定义的字符串 即在标题栏前半部分固定显示IP,后半则正常显示PROMPT_COMMAND的内容,后果就是标题栏占空间要大一点

tssh 要修改标题,只能通过修改服务器的输出来实现,和前面屏蔽PROMPT_COMMAND是一样的原理,我觉得不是很好。

ExpectSendText 支持 ssh tokens,我认为是可行的,一是使用 自动交互 的用户还不多,要输入 % 的就更少了,即使用到也可以简单地把 % 改成 %% 解决。

lonnywong commented 2 months ago

ExpectSendText* 已支持 ssh tokens

v0.1.22 发布前,可以这样安装 go install github.com/trzsz/trzsz-ssh/cmd/tssh@main,安装的路径在 ~/go/bin/

然后,参考下面配置即可:

Host xxx
    #!! ExpectCount 1
    #!! ExpectPattern1 $
    #!! ExpectSendText1 export PROMPT_COMMAND='echo -ne "\\033]0;%r@%h\\007"' && clear\r
Jabberworkkkk commented 2 months ago

新功能基本实现了想要的效果,除了个别已经在 .bashrc 里配置了$PS1的值的会又自动把标题给改回去,这种就不折腾了,感谢!

lonnywong commented 2 months ago

新功能基本实现了想要的效果,除了个别已经在 .bashrc 里配置了$PS1的值的会又自动把标题给改回去,这种就不折腾了,感谢!

#!! ExpectSendText1 export PROMPT_COMMAND='echo -ne "\\033]0;%r@%h\\007"' && unset PS1 && clear\r

这样是否可以?

Jabberworkkkk commented 2 months ago

新功能基本实现了想要的效果,除了个别已经在 .bashrc 里配置了$PS1的值的会又自动把标题给改回去,这种就不折腾了,感谢!

#!! ExpectSendText1 export PROMPT_COMMAND='echo -ne "\\033]0;%r@%h\\007"' && unset PS1 && clear\r

这样是否可以?

试了一下,有点问题。直接unset PS1那命令提示符那直接就没了...但肯定是可以改进的 我上面说的不折腾意思是指就我个人情况而言,需要登录的linux类服务器大部分是centos类的,ubuntu的不多,我懒得再去搜集那些ubuntu服务器的IP在ssh config里另写host配置不一样的自动应答命令。但要想实现肯定是可以的。