从终端使用 ssh 时如何识别您所在的服务器?
我每天必须通过 ssh 连接 30 台服务器,并不断在它们之间切换。
目前,我正在编辑选项卡名称并写入 IP 地址以在各个服务器之间跳转。
有没有自动的方法可以做到这一点(将服务器 IP 地址指定为选项卡名称)?还有其他不需要在每台服务器上编辑文件的替代方案吗?
答案1
我通常使用通过设置的主机名$PS1
。但是,如果您不怕麻烦,可以开始使用 GNU screen
,然后可以定义如下函数:
function ssh-title () {
host="${@: -1}" # You could customize it to make it identify the hostname better
IP=$(host "$host" | awk '/has address/ { print $4 }')
echo -ne '\033]0;'"$host"' - '"$IP"'\007'
screen ssh "$@"
}
解释:
- 即使您从本地 shell 设置标题,它也可能会被远程 shell 设置覆盖。
screen
不直接让远程 shell 执行此操作,您必须对其进行自定义以允许它这样做,从而更轻松地在本地设置标题并坚持使用它。 - 抬头主机名对应的 IP,同时考虑到最后一个参数作为主机名,并将其设置为标题。我不得不做一些审判 和 错误在我得到正确的
echo
字符串之前。你可能也必须这样做。 - 最后,使用
screen
命令启动会话ssh
。命令退出时会话结束。
您可以通过多种方式自定义它。例如,您可以将主机名和 IP 保存在文件中并从中读取(有点像ssh_config
)(也许还可以为标题保存其他内容,例如用户名)。
现在使用ssh-title some.host
连接。我认为这是唯一一种无需编辑任何服务器端内容即可完成此操作的方法。
答案2
答案3
另一个选择是使用液体提示--- 适用于bash
和zsh
,并且可以轻松配置终端标题设置,甚至在提示符中使用不同的颜色显示主机名:
答案4
这个解决方案有点儿老套,但我认为它能满足您的要求。您需要安装xdotool
并wmctrl
安装它才能工作。
首先,您必须编辑~/.bashrc
文件,因为默认情况下终端会在每一行之后重置其标题,从而使命令行标题集变得无用。
之后:xterm*|rxvt*)
代替:PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
和:PS1="${debian_chroot:+($debian_chroot)}\u@\h \w\a$ "
接下来,我们将创建一个名为ssh
任意名称的自定义脚本,但对于这个答案,我将调用我的脚本tab-ssh
。打开文本编辑器并将以下内容另存为tab-ssh
:
#!/usr/bin/env bash
WID=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}')
xdotool windowfocus $WID
xdotool key ctrl+shift+t
wmctrl -i -a $WID
sleep 1
title=$(echo "$*" | sed s/.*@//g)
xdotool type --delay 1 --clearmodifiers 'echo -en "\033]0;"'"${title}"'"\a"'
xdotool key Return
sleep 1
xdotool type --delay 1 --clearmodifiers "ssh $*"
xdotool key Return
然后使其可执行:
chmod +x tab-ssh
现在,假设您正在使用bash
和gnome-terminal
,运行脚本应该会打开一个新选项卡,重命名它,然后启动会话ssh
。例如:
tab-ssh [email protected]
将打开一个新标签,将其重命名为0.0.0.0
(即“@”符号后面的所有内容),然后执行[email protected]
。
使用以下内容创建: