当我登录到服务器时,Bash 提示会改变颜色

当我登录到服务器时,Bash 提示会改变颜色

有没有办法让 bash 提示符变得动态,以便它在登录服务器时改变颜色?

所以我希望在我的系统上颜色为绿色,连接到服务器时变为红色。我有大量服务器,我不想.bashrc在所有这些服务器上都使用不同的颜色。

答案1

远程提示由远程设置~/.bashrc。因此您仍需要将其复制到远程服务器。但是,您可以对所有主机使用单个提示~/.bashrc,并根据主机名设置提示颜色:

[ "$PS1" ] || return 0                           # continue only when interactive
case $(hostname -s) in
laptop*)
    prompt_color='\033[48;5;16m\033[38;5;46m'    # green(46) on black(16)
    ;;
server*)
    prompt_color='\033[48;5;16m\033[38;5;196m'   # red(196) on black(16)
    ;;
esac
ORIG_PS1=$PS1                                    # in case needed
PS1='<\['${prompt_color}'\]\h\[\033[m\]:\w>\$ '
unset prompt_color

笔记:

  • PS1如果尚未设置,则不要设置(即,如果 shell 不是交互式的)。测试PS1是否非空是确定 shell 是否交互式的一种非常常见的方法,并且您不想混淆执行此操作的程序。(可以说,更准确的测试是检查是否$-包含i。)

  • 如果您希望在登录远程服务器时运行此代码,则应始终让其中一个配置文件源~/.bashrc。但我假设您知道这一点。

  • 在 中PS1,转义代码必须括在 中\[...\]

  • \[033[m将前台和背景重置为默认值。所以这里,:\w出现在终端前台/背景中。

  • \[033[48;5;XXXm\033[38;5;YYYm将背景/前景设置为XXX/ YYY

  • 对于转储可用颜色的脚本,请尝试colortest

  • 检查提示符是什么样子的:

    echo -e "<\033[48;5;16m\033[38;5;196mhost\033[m:dir>$ "
    

答案2

如果您不想(不能)让远程拥有单独的PS1,那么我会说“不”,这至少会非常困难。考虑到在 SSH 连接上,本地端并不知道什么是 shell 提示符,什么是其他提示符,因此设置提示符的颜色实际上必须来自远程。您可以在启动会话之前设置颜色,但它们对所有输出都有效,直到ls或编辑器设置自己的颜色。

当然,您可以为会话设计一些包装器来检测所有看起来像提示的内容并对其进行着色,但是这很容易导致误报(在每一行上都用?着色),而且与只在您的或每台机器$上放置一行相比非常复杂。.profile.bashrc

对于多台机器,无论如何寻找解决方案来同步所有机器上的配置更改可能很有用。无论是专门为此制作的工具,还是只是一个脚本,或者只是运行一个循环来复制所有机器上的(一组)配置文件。

答案3

我正在使用带有 sshpass 的包装脚本,它将首先上传一个临时配置文件,然后使用该配置文件进行 ssh(并删除临时文件)。

该脚本的两个主要内容如下:
scp ~/.bash_remote "${USER}"@"${IP}":/tmp/.bash_tmp 1>/dev/null
ssh -t "${USER}"@"${IP}" "bash --rcfile /tmp/.bash_tmp; rm /tmp/.bash_tmp"

使用此功能您可以轻松定义远程会话的颜色。

我知道这并不能直接回答你的问题,但它可以用来解决它。

答案4

.bashrc此代码应位于服务器上主目录中文件的末尾。

提示将保持默认结构,至少在 Ubuntu 中是这样:

username@hostname:~/directoryname$

[--prompt_color-]:[--dir_color--]$

# Setting color for the prompt
# https://superuser.com/questions/1118683/bash-prompt-to-change-color-when-i-am-logged-into-a-server
#
# Color codes for XTerm
# https://www.ditig.com/256-colors-cheat-sheet
#
# Run only when interactive, i.e. when PS1 is set
if [ -n "${PS1}" ]; then
  prompt_color='\033[48;5;16m\033[38;5;166m'   # orange(166) on black(16)
  dir_color='\033[48;5;16m\033[38;5;87m'       # cyan(87)    on black(16)

  PS1='\['${prompt_color}'\]\u@\h\[\033[m\]:\['${dir_color}'\]\w\[\033[m\]\$ '

  unset prompt_color
  unset dir_color
fi

颜色代码如下: https://www.ditig.com/256-colors-cheat-sheet

好的做法是将代码包装在 if 语句中,这样测试语句就不会影响您在该代码后粘贴的任何代码。

对于多台服务器来说,考虑使用部署工具或脚本是一个好主意。

受到 Matei David 的回答的启发,谢谢!

相关内容