当我SSH到特定的服务器时,如何使苹果terminal窗口自动更改颜色scheme

当我进入远程生产服务器时,我想让terminal窗口的颜色scheme改变为明亮而可怕的东西,最好是红色,以警告我正在接触一个活的恐怖服务器。

我怎样才能让它自动检测到我已经在某个地方闪光了,如果某个地方在特定列表中,请更改颜色scheme?

我想更新Terminal.app的Scheme,不知道如何在纯linux / unix环境下做到这一点

~/bin/ssh放入以下脚本(确保~/bin/ /usr/bin/在PATH中的/usr/bin/之前):

 #!/bin/sh HOSTNAME=`echo $@ | sed s/.*@//` set_bg () { osascript -e "tell application \"Terminal\" to set background color of window 1 to $1" } on_exit () { set_bg "{0, 0, 0, 50000}" } trap on_exit EXIT case $HOSTNAME in production1|production2|production3) set_bg "{45000, 0, 0, 50000}" ;; *) set_bg "{0, 45000, 0, 50000}" ;; esac /usr/bin/ssh "$@" 

上面的脚本从“username @ host”行中提取主机名(假定您使用“ssh user @ host”login到远程主机)。

然后根据主机名称设置红色背景(对于生产服务器)或绿色背景(对于所有其他)。 结果你的所有的ssh窗口都将以彩色背景显示。

我在这里假定您的默认背景是黑色的,所以当您从远程服务器注销时,脚本会将背景颜色恢复为黑色(请参阅“trap on_exit”)。

请注意,但是这个脚本不会跟踪从一台主机到另一台主机的sshlogin链。 因此,如果您先login到testing服务器,则背景为绿色,然后从中login到产品。

Terminal的一个鲜为人知的function是,您可以将设置configuration文件的名称设置为一个命令名称,当您通过Shell> New Command …Shell> New Remote Connection …创build新的terminal时,它将select该configuration文件。

例如,复制您的默认configuration文件,将其命名为“ssh”,并将其背景颜色设置为红色。 然后使用New Command …来运行ssh host.example.com

它也匹配参数,例如,您可以为不同的远程主机select不同的设置。

这是一个基于现有答案的综合解决scheme,处理退出。 如果你不想处理16位颜色值,还包括一点额外的内容。

这应该放在你的〜/ .bash_profile中

 # Convert 8 bit r,g,b,a (0-255) to 16 bit r,g,b,a (0-65535) # to set terminal background. # r, g, b, a values default to 255 set_bg () { r=${1:-255} g=${2:-255} b=${3:-255} a=${4:-255} r=$(($r * 256 + $r)) g=$(($g * 256 + $g)) b=$(($b * 256 + $b)) a=$(($a * 256 + $a)) osascript -e "tell application \"Terminal\" to set background color of window 1 to {$r, $g, $b, $a}" } # Set terminal background based on hex rgba values # r,g,b,a default to FF set_bg_from_hex() { r=${1:-FF} g=${2:-FF} b=${3:-FF} a=${4:-FF} set_bg $((16#$r)) $((16#$g)) $((16#$b)) $((16#$s)) } # Wrapping ssh command with extra functionality ssh() { # If prod server of interest, change bg color if ...some check for server list then set_bg_from_hex 6A 05 0C end # Call original ssh command if command ssh "$@" then # on exit change back to your default set_bg_from_hex 24 34 52 fi } 
  • set_bg – 取4个(8位)颜色值
  • set_bg_from_hex – 取四个hex值。 我使用的大多数颜色参考都是hex的,所以这对我来说更简单了。 它可以进一步实际parsing#RRGGBB而不是RR GG BB,但它对我很好。
  • ssh – 用你想要的任何自定义逻辑包装默认的ssh命令。 if语句用于处理退出以重置背景颜色。

您可以在.bashrc中设置$ PS1variables。

 red='\e[0;31m' PS1="$\[${red}\]" 

编辑:要做到这一点打开terminal。 然后说

 #touch .bashrc 

然后,您可以在textEdit或TextWrangler中打开.bashrc,并添加以前的命令。

另一个解决scheme是在sshconfiguration文件中设置颜色海峡:

在〜/ .ssh / config里面

 Host Server1 HostName xxxx User ubuntu IdentityFile ~/Desktop/keys/1.pem PermitLocalCommand yes LocalCommand osascript -e "tell application \"Terminal\" to set background color of window 1 to {27655, 0, 0, -16373}" Host Server2 HostName xxxx User ubuntu IdentityFile ~/Desktop/keys/2.pem PermitLocalCommand yes LocalCommand osascript -e "tell application \"Terminal\" to set background color of window 1 to {37655, 0, 0, -16373}" 

结合答案1和2有以下几点:

按照1中的描述创build~/bin/ssh文件,内容如下:

 #!/bin/sh # https://stackoverflow.com/a/39489571/1024794 log(){ echo "$*" >> /tmp/ssh.log } HOSTNAME=`echo $@ | sed s/.*@//` log HOSTNAME=$HOSTNAME # to avoid changing color for commands like `ssh user@host "some bash script"` # and to avoid changing color for `git push` command: if [ $# -gt 3 ] || [[ "$HOSTNAME" = *"git-receive-pack"* ]]; then /usr/bin/ssh "$@" exit $? fi set_bg () { if [ "$1" != "Basic" ]; then trap on_exit EXIT; fi osascript ~/Dropbox/macCommands/StyleTerm.scpt "$1" } on_exit () { set_bg Basic } case $HOSTNAME in "178.222.333.44 -p 2222") set_bg "Homebrew" ;; "178.222.333.44 -p 22") set_bg "Ocean" ;; "192.168.214.111") set_bg "Novel" ;; *) set_bg "Grass" ;; esac /usr/bin/ssh "$@" 

使其可执行: chmod +x ~/bin/ssh

文件~/Dropbox/macCommands/StyleTerm.scpt具有以下内容:

 #https://superuser.com/a/209920/195425 on run argv tell application "Terminal" to set current settings of selected tab of front window to first settings set whose name is (item 1 of argv) end run 

单词Basic, Homebrew, Ocean, Novel, Grass都来自mac osterminal设置cmd,: 终端简介

与Xterm兼容的Unixterminal具有用于设置背景和前景色的标准转义序列。 我不确定Terminal.app是否分享它们; 这应该。

 case $HOSTNAME in live1|live2|live3) echo -e '\e]11;1\a' ;; testing1|testing2) echo -e '\e]11;2\a' ;; esac 

第二个数字指定所需的颜色。 0 =默认,1 =红色,2 =绿色等。所以这个片段,当放在一个共享的.bashrc,会给你在现场服务器上的红色背景和testing的绿色背景。 你也应该添加这样的东西来重置背景,当你注销。

 on_exit () { echo -e '\e]11;0\a' } trap on_exit EXIT 

编辑:谷歌提出了一种使用AppleScript设置背景颜色的方法 。 显然,这只能在Terminal.app所在的机器上运行。 你可以用一些包装函数来解决这个问题:

 set_bg_color () { # color values are in '{R, G, B, A}' format, all 16-bit unsigned integers (0-65535) osascript -e "tell application \"Terminal\" to set background color of window 1 to $1" } sshl () { set_bg_color "{45000, 0, 0, 50000}" ssh "$@" set_bg_color "{0, 0, 0, 50000}" } 

当连接到一个活的服务器时,你需要记住运行sshl而不是ssh。 另一个select是为ssh编写一个包装函数,它扫描已知实时主机名的参数并相应地设置背景。

为什么不通过SSHlogin就更改shell提示符? 通常有特定的shellvariables: SSH_CLIENTSSH_CONNECTIONSSH_TTY