Bash solicita cambiar de color cuando estoy conectado a un servidor

15

¿Hay alguna manera de hacer que el indicador bash sea dinámico, de modo que cambie de color cuando inicie sesión en un servidor?

Entonces, quiero que el color sea verde cuando esté en mi sistema y cambie a rojo cuando esté conectado a los servidores. Tengo una gran cantidad de servidores que no quiero poner diferente .bashrcen todos esos.

nitinas
fuente
Probablemente no. Pero volvamos a ella superuser.com/questions/33712/…
aleatorio
1
¿Por qué no hacer que su terminal sea rojo (o algún otro color) para que cuando se conecte a ellos obtenga un blanco predeterminado?
Restablece a Monica - ζ--

Respuestas:

9

El indicador remoto lo establece el control remoto ~/.bashrc. Entonces todavía necesita copiarlo en el servidor remoto. Sin embargo, puede usar un solo ~/.bashrcpara todos los hosts y establecer el color de solicitud en función del nombre de host:

[ "$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

Notas:

  • No establezca PS1si aún no está configurado (es decir, si el shell no es interactivo). Probar si PS1no está vacío es una forma muy común de decidir si el shell es interactivo, y no desea confundir los programas que lo hacen. (Podría decirse que una prueba más precisa es verificar si $-contiene i).

  • Si desea que este código se ejecute al iniciar sesión en un servidor remoto, debe tener uno de los archivos de perfil siempre fuente ~/.bashrc. Pero supongo que lo sabes.

  • En PS1, los códigos de escape deben estar incluidos \[...\].

  • \[033[mrestablece el primer plano y el fondo a los valores predeterminados. Así que aquí, :\waparece en primer plano / fondo terminal.

  • \[033[48;5;XXXm\033[38;5;YYYmestablece el fondo / primer plano en XXX/ YYY.

  • Para una secuencia de comandos que vuelca los colores disponibles, intente colortest.

  • Para comprobar cómo se vería la solicitud:

    echo -e "<\033[48;5;16m\033[38;5;196mhost\033[m:dir>$ "
Matei David
fuente
7

Si no desea (no puede) hacer que los controles remotos tengan una separación PS1, entonces diría "no", sería al menos terriblemente difícil. Tenga en cuenta que en una conexión SSH, el lado local no tiene una idea real de qué es un indicador de comandos de shell y qué es otra cosa, por lo que la configuración de colores para el indicador realmente debe provenir del control remoto. Puede establecer colores antes de comenzar la sesión, pero serían efectivos para todos los resultados, es decir, hasta que lsun editor establezca sus propios colores.

Por supuesto, podría encontrar un contenedor para la sesión para detectar todo lo que parece un aviso y colorearlo, pero fácilmente daría lugar a falsos positivos (¿color en cada línea con un $?) Y sería terriblemente complicado en comparación con solo dejar caer un línea única a su .profileo .bashrcen cada máquina.

Con varias máquinas, puede ser útil en cualquier caso buscar soluciones para sincronizar los cambios de configuración en todas ellas. Ya sea una herramienta hecha para ello, o simplemente un script, o simplemente ejecutando un bucle para copiar un (conjunto de) archivo (s) de configuración en todos ellos.

ilkkachu
fuente
2
Ese último párrafo es la clave. Si OP está administrando "una gran cantidad de servidores", es sorprendente que cada uno tenga que configurarse individualmente en primer lugar.
Lightness compite con Monica el
5

Estoy usando un script de envoltura con sshpass que primero cargará un perfil temporal y luego ssh usando este perfil (y eliminará el archivo temporal).

Las dos cosas principales del guión son estas:
scp ~/.bash_remote "${USER}"@"${IP}":/tmp/.bash_tmp 1>/dev/null
ssh -t "${USER}"@"${IP}" "bash --rcfile /tmp/.bash_tmp; rm /tmp/.bash_tmp"

Con esto, puede definir fácilmente los colores de las sesiones remotas.

Sé que esto no responde directamente a su pregunta, pero podría usarse para resolverlo.

Mikael Kjær
fuente
3
¡No lo uses sshpass -psi es posible! Los argumentos de la línea de comando para ejecutar programas generalmente son visibles para todos los usuarios ps, y también lo será la contraseña. Incluso si no tiene otras cuentas de usuario en la máquina, puede imprimirla en la pantalla accidentalmente. sshpasspuede leer la contraseña de una variable de entorno, que no es demasiado difícil de usar. Además, considere las claves ssh si de todos modos va a guardar las credenciales de inicio de sesión en un archivo.
ilkkachu
Tienes razón y no estaba tratando de promover su uso. Solo estaba pegando como un ejemplo de mi script que solo se usa para fines de desarrollo y no proporciona ningún riesgo de seguridad. La variable SSHPASS se dejará vacía para los sistemas de producción donde se usan claves ssh. Voy a actualizar.
Mikael Kjær
1

Puede que le interese context-color, que he reunido para ese propósito exacto: https://github.com/ramnes/context-color

Es un script simple que, cuando se ejecuta, genera un color basado en el hash de la salida de un comando. Con esto instalado en algún lugar de tu $PATH, puedes hacer algo como esto en tu .bashrc:

export PS1="$(context-color -p)$PS1\[\e[0m\]"

(¿dónde --prompt/-pestá el interruptor para que el color se escape para las indicaciones y \[\e[0m\]la secuencia de escape para restablecer el color)

Por defecto, el comando utilizado para generar el hash es whoami; hostname. Si solo desea que el color cambie de acuerdo con el nombre de host, puede cambiar el $CONTEXTentorno variable ( export CONTEXT="hostname") o simplemente usar la --context/-copción ( context-color -c "hostname").

Vea a continuación un ejemplo:

manifestación

ramnes
fuente