有没有一种方法可以使bash提示符动态化,以便在登录服务器时更改颜色?
因此,我希望在系统上时该颜色为绿色,并在连接到服务器时变为红色。我有大量的服务器,不想.bashrc
在所有这些服务器上使用不同的服务器。
有没有一种方法可以使bash提示符动态化,以便在登录服务器时更改颜色?
因此,我希望在系统上时该颜色为绿色,并在连接到服务器时变为红色。我有大量的服务器,不想.bashrc
在所有这些服务器上使用不同的服务器。
Answers:
远程提示由远程设置~/.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
如果尚未设置(例如,外壳不是交互式的),则不要设置。测试if 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>$ "
如果您不想(不能)使遥控器具有单独的PS1
,那么我会说“ no”,那至少会非常困难。考虑到在SSH连接上,本地方对什么是shell提示以及其他内容一无所知,因此为提示设置颜色确实必须来自远程。您可以在开始会话之前设置颜色,但是它们将对所有输出有效,直到一个ls
或一个编辑器自行设置颜色为止。
当然,您可以为该会话提供一些包装程序,以检测看起来像提示符的所有内容并为其着色,但是$
与仅丢弃a相比,它很容易导致误报(每行的颜色带有?),并且非常复杂。单线连接到您的机器.profile
或.bashrc
每台机器上。
对于许多机器,在任何情况下搜索用于同步所有机器上的配置更改的解决方案可能很有用。它是为此而开发的工具,还是只是脚本,或者只是运行循环以在它们全部上复制(一组)配置文件。
我正在使用带有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密钥。
您可能对此感兴趣context-color
,我已经将其汇总用于此特定用途:https : //github.com/ramnes/context-color
这是一个简单的脚本,在执行时会根据命令输出的哈希值输出颜色。将它安装在您的某个位置后$PATH
,您可以在您的计算机中执行以下操作.bashrc
:
export PS1="$(context-color -p)$PS1\[\e[0m\]"
(在哪里--prompt/-p
进行切换,以便在提示时转义颜色,而\[\e[0m\]
转义序列可重设颜色)
默认情况下,用于生成哈希的命令为whoami; hostname
。如果只想根据主机名更改颜色,则可以更改$CONTEXT
变量环境(export CONTEXT="hostname"
)或仅使用--context/-c
选项(context-color -c "hostname"
)。
参见以下示例: