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

nit*_*ins 16 bash shell colors bashrc

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

所以我希望在我的系统上颜色为绿色,并在连接到服务器时更改为红色。我有大量的服务器,我不想.bashrc在所有这些服务器上添加不同的内容。

Mat*_*vid 10

远程提示由远程设置~/.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
Run Code Online (Sandbox Code Playgroud)

笔记:

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

  • 如果您希望在登录远程服务器时运行此代码,您应该让配置文件之一始终为 source ~/.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>$ "
    
    Run Code Online (Sandbox Code Playgroud)


ilk*_*chu 7

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

当然,您可以为会话想出一些包装器来检测所有看起来像提示的内容并对其进行着色,但它很容易导致误报(每一行的颜色都带有$?),并且与仅删除一个单行到您的.profile.bashrc每台机器上。

对于许多机器,在任何情况下搜索解决方案以同步所有机器上的配置更改可能很有用。无论是为它制作的一些工具,还是只是一个脚本,或者只是运行一个循环来复制一个(一组)配置文件。

  • 最后一段是关键。如果 OP 正在管理“大量服务器”,那么令人惊讶的是,首先必须单独配置每个服务器。 (2认同)

Mik*_*jær 5

我正在使用带有 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"

使用它,您可以轻松定义远程会话的颜色。

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

  • 尽可能不要使用`sshpass -p`!运行程序的命令行参数通常对 `ps` 中的所有用户可见,密码也是如此。即使您在机器上没有其他用户帐户,您也可能不小心将其打印在屏幕上。`sshpass` 可以从环境变量中读取密码,使用起来并不难。此外,如果您打算将登录凭据保存到文件中,请考虑使用 ssh 密钥。 (3认同)