¿Cómo puedo hacer que la ventana del terminal de Apple cambie automáticamente el esquema de color cuando ssh a un servidor específico?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Cuando me conecto a un servidor de producción remoto, me gustaría que el esquema de color de la ventana de mi terminal cambiara a algo brillante y aterrador, preferiblemente rojo, para avisarme de que estoy tocando un servidor que da miedo en vivo.

¿Cómo puedo hacer que detecte automáticamente que he guardado algún sitio y, si ese lugar está en una lista específica, cambia la combinación de colores?

Quiero actualizar el Esquema de Terminal.app, no sé cómo haría esto en un entorno Linux / UNIX puro

¿Fue útil?

Solución

Coloque el siguiente script en ~ / bin / ssh (asegúrese de que ~ / bin / aparezca antes de / usr / bin / en su RUTA) :

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

El script anterior extrae el nombre de host de la línea " username @ host " (asume que inicias sesión en hosts remotos con " ssh usuario @ host ").

Luego, dependiendo del nombre del host, establece fondo rojo (para servidores de producción) o fondo verde (para todos los demás). Como resultado, todas las ventanas ssh tendrán un fondo de color.

Supongo que aquí el fondo predeterminado es negro, por lo que la secuencia de comandos revierte el color de fondo a negro cuando se desconecta del servidor remoto (consulte " trap on_exit ").

Tenga en cuenta, sin embargo, que esta secuencia de comandos no realiza un seguimiento de la cadena de inicios de sesión ssh de un host a otro. Como resultado, el fondo será verde en caso de que primero inicie sesión en el servidor de prueba y luego inicie sesión en producción desde este.

Otros consejos

Una característica menos conocida de Terminal es que puede establecer el nombre de un perfil de configuración en un nombre de comando y seleccionará ese perfil cuando cree un nuevo terminal a través de Shell > Nuevo comando & # 8230; o Shell > Nueva conexión remota & # 8230; .

Por ejemplo, duplique su perfil predeterminado, asígnele el nombre & # 8220; ssh & # 8221; y establecer su color de fondo en rojo. Luego use Nuevo comando & # 8230; para ejecutar ssh host.example.com .

También coincide con los argumentos, por lo que puede hacer que elija diferentes configuraciones para diferentes hosts remotos, por ejemplo.

Aquí hay una solución combinada basada en un par de respuestas existentes que maneja la salida. También incluye un poco más si no quieres lidiar con valores de color de 16 bits.

Esto se debe poner en su ~/.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: toma valores de color de 4 (8 bits)
  • set_bg_from_hex: toma 4 valores hexadecimales. La mayoría de las referencias de color que uso están en hexadecimal, así que esto me lo facilita. Se podría dar un paso más para analizar #RRGGBB en lugar de RR GG BB, pero me funciona bien.
  • ssh: envuelve el comando ssh predeterminado con la lógica personalizada que desee. La instrucción if se usa para controlar la salida para restablecer el color de fondo.

Combinación de respuestas 1 y 2 tienen lo siguiente:

Cree el archivo ~ / bin / ssh como se describe en 1 con el siguiente contenido:

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

Hazlo ejecutable: chmod + x ~ / bin / ssh .

El archivo ~ / Dropbox / macCommands / StyleTerm.scpt tiene el siguiente contenido:

#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

Las palabras Basic, Homebrew, Ocean, Novel, Grass son de la configuración de terminal mac os cmd , : perfiles de terminal

Puedes establecer la variable $ PS1 en tu .bashrc.

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

EDITAR:   Para ello abre la Terminal. Entonces di

#touch .bashrc

Luego puede abrir .bashrc en textEdit o en TextWrangler y agregar los comandos anteriores.

Otra solución es establecer el estrecho de colores en el archivo de configuración ssh:

dentro de ~ / .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}"

Los terminales Unix compatibles con Xterm tienen secuencias de escape estándar para configurar los colores de fondo y de primer plano. No estoy seguro de si Terminal.app los comparte; debería.

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

El segundo número especifica el color deseado. 0 = predeterminado, 1 = rojo, 2 = verde, etc. Entonces, este fragmento de código, cuando se coloca en un .bashrc compartido, le dará un fondo rojo en los servidores en vivo y un fondo verde en los de prueba. También debe agregar algo como esto para restablecer el fondo cuando cierre la sesión.

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

EDITAR: Google mostró una forma de establecer el color de fondo con AppleScript . Obviamente, esto solo funciona cuando se ejecuta en la misma máquina que Terminal.app. Puede solucionarlo con un par de funciones de envoltorio:

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

Necesitará recordar ejecutar sshl en lugar de ssh cuando se conecte a un servidor en vivo. Otra opción es escribir una función de envoltorio para ssh que analice sus argumentos en busca de nombres de host en vivo conocidos y establezca el fondo en consecuencia.

¿Por qué no solo cambiando el indicador de la shell cada vez que inicia sesión a través de SSH? Normalmente hay variables de shell específicas: SSH_CLIENT , SSH_CONNECTION , SSH_TTY

Establezca los colores del terminal en el /.bashrc del servidor

Necesitaba lo mismo, algo para que me diera cuenta de que estaba en un servidor de producción o de puesta en escena y no en mi entorno de desarrollo, lo que puede ser muy difícil de detectar, especialmente cuando estoy en una consola Ruby o algo así.

Para lograr esto, usé el comando setterm en el archivo ~. / bashrc de mi servidor para invertir los colores del terminal al conectar y restaurar los colores al salir.

~ / .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

Luego puse esto en todos los archivos ~ / .bashrc de los servidores para saber cuándo mi terminal está en un servidor remoto o no.

Otra ventaja es que cualquiera de su equipo de desarrollo o de desarrollo se beneficia de esto sin que sea parte del proceso de incorporación.

Funciona muy bien.

Debes cambiar el color del nombre de usuario y el nombre de la máquina host.

agregue la siguiente línea a su archivo ~ / .bash_profile :

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

La primera parte (color púrpura) es lo que estás buscando.

Vista previa: ingrese la descripción de la imagen aquí

Estos son mis colores preferidos. Puede personalizar cada parte del color del indicador cambiando los códigos de m (por ejemplo, 34m ) que son códigos de color ANSI.

Lista de códigos de colores ANSI:

  • Negro: 30m
  • Rojo: 31m
  • Verde: 32m
  • Amarillo: 33m
  • Azul: 34m
  • Púrpura: 35m
  • Cian: 36m
  • Blanco: 37m
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top