Últimamente me estoy metiendo a configurar máquinas virtuales en casa. Más adelante hablaré sobre todos los pasos necesarios, pero de momento me voy a referir al importante detalle de identificar la máquina en la que se trabaja.
Claro que todas las máquinas tienen nombre, pero ¿realmente leemos el nombre de máquina que aparece en el prompt de la shell?
root@vmserver:~#
¿Qué máquina es esa? Hay que fijarse mucho para ver que se trata de una máquina llamada vmserver. Y si tenemos varias máquinas abiertas en distintas pestañas de nuestro programa de terminal, es fácil confundirse. A mí me ha pasado ejecutar un poweroff en la máquina física pensando en apagar una máquina virtual. Y duele.
Así que me decidí a identificarlas por colores.
Las instrucciones de debajo son bastante generales pero has sido comprobadas en una máquina Debian. En otras distribuciones de Linux puede ser ligeramente diferente y en otros Unix muy diferente.
Toda sesión de shell de una máquina comienza ejecutando el fichero /etc/profile. Y este fichero a su vez llama a /etc/bash.bashrc (en el caso de que la shell en uso sea bash y el acceso sea interactivo).
Este segundo fichero define la variable PS1 de esta manera:
# set a fancy prompt (non-color, overwrite the one in /etc/profile) PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
Esto prepara el bonito prompt al que estamos acostumbrados, con user@host:directorio$ .
root@vmserver:~#
Pero decidí que las máquinas virtuales tuvieran el prompt azul para distinguirlas de la máquina física, así que lo modifiqué de esta manera:
set a fancy prompt (non-color, overwrite the one in /etc/profile) PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' # extra color for real/virtual machine differentiation MACHINECOLOR=34 STARTCOLOR="\e[0;${MACHINECOLOR}m"; ENDCOLOR="\e[0m" export PS1="$STARTCOLOR$PS1$ENDCOLOR"
Aparte de un detalle para controlar si estamos en un chroot e indicárnoslo, obtenemos el bonito resultado de
root@vmserver:~#
STARTCOLOR se encarga de iniciar el azul, y ENDCOLOR de finalizarlo, lo que es muy importante para evitar que todo el texto quede azul:
root@vmserver:~# ls root@vmserver:~# echo 1 1 root@vmserver:~#
34 es el código para el azul. Hay otros:
Black | 0;30 |
Red | 0;31 |
Green | 0;32 |
Brown | 0;33 |
Blue | 0;34 |
Purple | 0;35 |
Cyan | 0;36 |
Light Gray | 0;37 |
Dark Gray | 1;30 |
Light Red | 1;31 |
Light Green | 1;32 |
Yellow | 1;33 |
Light Blue | 1;34 |
Light Purple | 1;35 |
Light Cyan | 1;36 |
White | 1;37 |
Modificado de http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html
Lo importante es que estos no son códigos de bash sino secuencias de escape ANSI/VT-100, porque no las interpreta la shell sino la terminal.
Así, podemos usar otros códigos ANSI/VT100 para conseguir otros efectos. Como los que necesito en la máquina física.
# set a fancy prompt (non-color, overwrite the one in /etc/profile) PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' # extra color for real/virtual machine differentiation MACHINECOLOR=31 # root differentiation if [ $(id -u) -eq 0 ] ; then MACHINECOLOR="7;$MACHINECOLOR" fi STARTCOLOR="\e[0;${MACHINECOLOR}m"; ENDCOLOR="\e[0m" export PS1="$STARTCOLOR$PS1$ENDCOLOR"
Aquí utilizo el código 31 que corresponde al rojo, color universal de aviso, que en este caso me indica que estoy en la máquina real, para evitar meter la pata. Pero hay un detalle más: se comprueba si el usuario es root y si es así, se utiliza el código 7 para invertir los colores:
user@realserver:~$ ls user@realserver:~$ echo 1 1 user@realserver:~$ su - Contraseña: root@realserver:~# ls root@realserver:~# echo 1 1 root@realserver:~#
Con lo cual ahora es bastante más difícil equivocarse de máquina o no recordar que uno es root.
El pequeño problema es que normalmente PS1 es posteriormente redefinido en el fichero ~/.bashrc que es llamado desde ~/.profile:
if [ "$color_prompt" = yes ]; then PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' else PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' fi unset color_prompt force_color_prompt
Así que en el fichero ~/.bashrc de cada usuario, y en el fichero /etc/skel/.bashrc para los nuevos usuarios que se creen, hay que modificarlo a esto:
if [ "$color_prompt" = yes ]; then PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' else #PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' PS1=$PS1 fi unset color_prompt force_color_prompt
Y ya tenemos nuestras terminales perfectamente coloreadas.
No hay comentarios:
Publicar un comentario