Como posso fazer o esquema de mudança de cor maçã terminal de janela auto quando eu ssh para um servidor específico

StackOverflow https://stackoverflow.com/questions/157959

  •  03-07-2019
  •  | 
  •  

Pergunta

Quando eu ssh em um servidor de produção remota gostaria que o esquema de cores da minha janela do terminal para mudar para brigh algo e assustador, de preferência vermelho, para me avisar que eu estou tocando um servidor assustador ao vivo.

Como posso fazê-lo automaticamente detectar que tenho ssh'ed em algum lugar, e se isso em algum lugar é em uma lista específica, altere o esquema de cores?

Eu quero atualizar o esquema de Terminal.app, não sei como eu iria fazer isso em um linux puro / unix env

Foi útil?

Solução

Coloque seguinte script no ~/bin/ssh (garantir ~/bin/ olhou antes /usr/bin/ em seu PATH):

#!/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 "$@"

O script acima nome extratos anfitrião da linha "username @ host" (ele assume que você login para hosts remotos com "usuário ssh @ host").

Em seguida, dependendo nome do host que quer define fundo vermelho (para servidores de produção) ou fundo verde (para todos os outros). Como resultado, todas as suas janelas ssh será com fundo colorido.

Eu assumo aqui o seu padrão de fundo é preto, assim roteiro reverte a cor de volta fundo para preto quando você sair do servidor remoto (consulte "armadilha on_exit").

Por favor, note, entretanto, esse script não acompanha cadeia de logins SSH a partir de um hospedeiro para outro. Como resultado, o fundo será verde no caso de você login para testar servidor primeiro, depois de login para a produção da mesma.

Outras dicas

Uma característica menos conhecida do Terminal é que você pode definir o nome de um perfil de configurações para um nome de comando e ele vai selecionar esse perfil quando você cria um novo terminal, quer através de Shell> New Comando ... ou Shell> Nova Conexão remota ... .

Por exemplo, duplicar o seu perfil padrão, o nome “ssh” e definir a cor de fundo para vermelho. Em seguida, use Novo Comando ... para executar ssh host.example.com.

Ele também corresponde em argumentos, para que possa tê-lo escolher configurações diferentes para diferentes hosts remotos, por exemplo.

Aqui está uma solução combinada com base em um par de respostas existentes que lida com a saída. Também inclui um pouco mais se você não quer lidar com valores de cor de 16 bits.

Este deve ser colocado na sua ~ / .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 - leva 4 (8 bit) valores de cor
  • set_bg_from_hex - leva 4 valores hexadecimais. a maioria das minhas referências de cores que eu uso são em hexadecimal, então isso apenas torna mais fácil para mim. Pode ser mais um passo para realmente parse #RRGGBB vez de RR GG BB, mas funciona bem para mim.
  • ssh - envolvendo o comando ssh padrão com qualquer lógica personalizada que você deseja. A instrução if é usada para manipular a saída para repor a cor de fundo.

A combinação de respostas 1 e 2 ter o seguinte:

Criar arquivo ~/bin/ssh conforme descrito no 1 com o seguinte conteúdo:

#!/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 "$@"

torná-lo executável:. chmod +x ~/bin/ssh

~/Dropbox/macCommands/StyleTerm.scpt arquivo tem o seguinte conteúdo:

#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

Palavras Basic, Homebrew, Ocean, Novel, Grass são de configurações do terminal mac os cmd , : perfis terminais

Você pode definir a variável PS1 $ em seu .bashrc.

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

EDIT: Para fazer isso, abra o Terminal. Então diga

#touch .bashrc

Você pode .bashrc então aberto no TextEdit ou na TextWrangler e add os comandos anteriores.

Outra solução é definir as cores Estreito no arquivo ssh config:

dentro ~ / .ssh / config

Host Server1
   HostName x.x.x.x
   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 x.x.x.x
   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}"

terminais Unix Xterm compatíveis têm sequências de escape padrão para definir as cores de fundo e de primeiro plano. Eu não tenho certeza se as ações Terminal.app eles; deveria.

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

O segundo número especifica a cor desejada. 0 = padrão, 1 = vermelho, 2 = verde, etc. Portanto, este trecho, quando colocado em um compartilhada .bashrc, lhe dará um fundo vermelho em servidores ao vivo e um fundo verde em uns testes. Você também deve adicionar algo como isto para repor o fundo quando você sair.

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

EDIT: Google transformou-se uma maneira de definir a cor de fundo usando AppleScript . Obviamente, isso só funciona quando executado na mesma máquina como Terminal.app. Você pode resolver isso com funções par de mensagens publicitárias:

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}"
}

Você precisa se lembrar de executar SSHL vez de ssh ao se conectar a um servidor ao vivo. Outra opção é escrever uma função wrapper para ssh que varre seus argumentos para nomes de host ao vivo conhecidas e define o fundo em conformidade.

Porque não basta mudar o shell prompt de sempre que você está logado via SSH? Há variáveis ??do shell normalmente específicos: SSH_CLIENT , SSH_CONNECTION , SSH_TTY

Definir as cores dos terminais no servidor é /.bashrc

Eu precisava a mesma coisa, algo que me faça ciente de que eu estava em um servidor de teste ou de produção e não no meu ambiente de desenvolvimento, o que pode ser muito difícil dizer, especialmente quando em um console Ruby ou algo assim.

Para conseguir isso, eu usei o comando setterm no arquivo ~./bashrc do meu servidor para inverter as cores do terminal quando ligam e restaurar as cores quando sair.

~ / .bashrc

# Inverts console colours so that we know that we are in a remote server. 
# This is very important to avoid running commands on the server by accident.
setterm --inversescreen on

# This ensures we restore the console colours after exiting.
function restore_screen_colours {
  setterm --inversescreen off
}
trap restore_screen_colours EXIT

Eu, então, colocar isso em arquivos ~/.bashrc todos dos servidores para que eu sei quando meu terminal estiver em um servidor remoto ou não.

Outro bônus é que qualquer um dos seus desenvolvimento ou DevOps equipe obter o benefício deste sem torná-lo parte do processo de integração.

Funciona muito bem.

Você deve alterar a cor do nome da máquina nome de usuário e host.

adicione a seguinte linha ao seu arquivo ~/.bash_profile:

export PS1=" \[\033[34m\]\u@\h \[\033[33m\]\w\[\033[31m\]\[\033[00m\] $ "

O primeira parte (roxo colorido) é o que você está procurando.

Preview: enter descrição da imagem aqui

Esta é minhas cores preferidas. Você pode personalizar cada parte de cor de alerta, alterando os códigos m (por exemplo 34m), que são códigos de cores ANSI.

Lista de códigos ANSI Cor:

  • Black: 30m
  • Red: 31m
  • Green: 32m
  • Amarelo: 33m
  • Blue: 34m
  • Purple: 35m
  • Cyan: 36m
  • White: 37m
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top