当我通过 SSH 连接到远程机器时,如何更改我的(Linux)终端的外观?

当我通过 SSH 连接到远程机器时,如何更改我的(Linux)终端的外观?

我有时会发现自己打开了多个终端,其中一些终端通过 ssh 连接到其他(生产)机器。如果我在其中一个 ssh 终端上运行“删除数据库中的所有表”之类的命令,我可能会破坏大量客户数据。但在开发过程中,我当然需要不时运行这些命令。

所以,我想知道:有没有办法让我的终端(理想情况下是内置的 GNOME 终端,但如果有必要,我愿意切换到其他终端程序)在通过 ssh 连接到远程计算机时改变其外观?理想情况下,我会使用正常的黑色背景,但当我通过 ssh 连接到远程计算机时,背景会变为红色。也许窗口的边框也会变为红色并开始闪烁或类似情况。

不过,外观变化的细节并不重要:重要的是让我立即意识到,在某个地方通过 ssh 连接的终端上工作时,我需要更加小心。这可能吗?

PS我确实找到了上下文 SSH,这正是我想要的......只是它只适用于 Mac :-(

答案1

我建议将您的 $PS1 设置为相关信息,例如主机名等。您可以查看您选择的 shell 的手册页以了解详细信息。

以下是您可以对 PS1 执行的操作示例狂欢

我自己在 ~/.subbash/ 中有一个测试迅速的根据服务器设置提示的颜色。*

*参见 __prompt_command() 函数

改变 PS1 的方法

您可以通过多种方式自定义 PS1,听起来您想要一些更引人注目的东西,所以我的示例会比仅仅将其添加\H到 PS1 更复杂一些。要使用以下任何一种,您可以将它们添加到您的~/.bashrc(在远程服务器上,如果不是两者。我在所有计算机之间同步相同的配置)

笔记:为了使这些内容更具可读性,以下假定这些变量已声明。
变量可以很容易地用内容替换。
此外,这些示例偏向于 bash,您可能需要针对其他 shell 进行调整。

RCol='\[\e[0m\]'    # Text Reset
Red='\[\e[0;31m\]'  # Red
Gre='\[\e[0;32m\]'  # Green
Yel='\[\e[0;33m\]'  # Yellow
Blu='\[\e[0;34m\]'  # Blue
Pur='\[\e[0;35m\]'  # Purple
Cya='\[\e[0;36m\]'  # Cyan
Whi='\[\e[0;37m\]'  # White

根检查

您可能喜欢的一件事是测试 $USER,看它是否是 root,或者可能是一个仅限“生产”的帐户:

if [ $UID -eq "0" ];then
    PS1="${Red}\h \W ->${RCol} "        # Set prompt for root
else
    PS1="\h \W -> "
fi

如果你是 root,这将使提示符变为红色。

主机检查

您还可以测试有关当前机器的信息,并据此设置颜色:

PS1=
PSCol=
if [ $HOSTNAME == 'moving-computer-of-doom' ]; then
    PSCol="$Cya"                # For Main Computer
elif [ $HOSTTYPE == 'arm' ]; then
    PSCol="$Gre"                # For pi
elif [ $HOSTNAME == 'ma.sdf.org' ]; then
    PSCol="$Blu"                # For MetaArray
elif [[ $MACHTYPE =~ arm-apple-darwin ]]; then
    PSCol="$Gre"                # For iOS
elif [ $MACHTYPE == 'i486-pc-linux-gnu' ]; then
    PSCol="$Whi"                # For Netbook
elif [[ "$MACHTYPE" == "x86_64--netbsd" && "$OSTYPE" == "netbsd" ]]; then
    PSCol="$Yel"                # For Main Cluster
else
    PS1+="\h "              # Un-designated catch-all
fi

PS1+="${PSCol}\W ->${RCol} "

如果在我的笔记本电脑上,这会将提示设置为青色,如果在我的 pi 或 iOS 上,则设置为绿色,等等。
如果没有列出,它会将主机名添加到提示中。
因此,如果您的生产服务器有一些易于测试的东西(例如类似的主机名,您可以使用它)

PROMPT_COMMAND

在大多数情况下,即使没有这个,上面的操作也能正常工作。
如果您开始添加想要更频繁地重新评估登录的内容(可能是目录的 git 状态),则可以使用 PROMPT_COMMAND 函数在每个命令之后评估 PS1。

即使没有这个,上面的工作也可以正常进行。

笔记:抱歉,如果这些看起来令人困惑,这些都是从我使用的设置中获取的,并且经过修改后无需其他设置就可以工作。

答案2

这是一篇很棒的文章,我用它来自定义我的 bash 提示符:

http://www.ibm.com/developerworks/linux/library/l-tip-prompt/

由于我已将提示的主机名部分设置为红色,因此当我登录到服务器时可以轻松看到。

我在 bash_profile 中用作 PS1 的值是:

PS1="[\e[32;1m]\u[\e[0m][\e[34;1m]@[\e[0m][\e[31;1m]\h[\e[0m]:[\e[34;1m]\w $[\e[0m] "

这样我的用户名就变成绿色,后面跟着蓝色的“@”符号,然后主机名变成红色,最后是蓝色的“~$”。您可能已经看到自定义是多么容易,可以帮助您轻松查看何时登录到不同的服务器

请务必仔细阅读本文,因为它解释了如何正确转义每个序列。如果无法转义序列,则在输入较长的命令时可能会导致一些不可预测的行为。

答案3

显然,所有先前的答案都只适用于 Bash。我在某些设备上使用 Busybox,因此需要一个替代方案。

根据您可以在登录脚本中添加一行通用代码,该脚本应该可以工作(对我来说,它在多个不同的主机上都有效):

echo -n "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"

相关内容