Marcando estilo en tu Shell de Linux

En esta entrada os voy a explicar cómo personalizar vuestra Shell de Linux, pero antes de nada me gustaría aclarar ciertos conceptos que suelen confundirse y que son los siguientes:

  • Terminal = tty = Entorno de entrada y salida de texto
  • Console = Terminal físico
  • Shell = Intérprete de línea de comandos

Hablando en tiempos pretéritos, la forma de interactuar con computadoras Unix era mediante dispositivos teleprinter parecidos a máquinas de escribir, algunas veces llamados teletypewriter o "tty".

teletypewriter

El nombre de terminal viene del punto de vista de la electrónica y el nombre consola viene del punto de vista del mueble. En sistemas tipo Unix, tty es el tipo de fichero particular que implementa un número de comandos adicionales (ioctls) más allá de lectura y escritura. Terminal es asumido como un sinónimo de tty y algunas ttys son proveídas por el kernel del sistema operativo a favor de un dispositivo de hardware (como el teclado, modem o puertos seriales). Otras ttys, llamadas también pseudo ttys, son proveídas por programas llamados emuladores de terminal, como son Xterm, Screen, SSH...

Una consola generalmente es un terminal físicamente hablando, que hace referencia al primer terminal conectado a la compuradora. En algunos sistemas como Linux y FreeBSD, la consola dispone de múltiples ttys que pueden ser seleccionados mediante la combinación de teclas:

CTRL+ALT+[F1 ... F12]

Siendo cada uno de los Fx desde F1 a F12 los distintos tty disponibles en el sistema.

Un shell es la interfaz principal que los usuarios ven cuando inician sesión, y cuyo propósito es iniciar otros programas. En sistemas Unix, shell hace alusión a la línea de comandos, cuya finalidad es recibir nombres de aplicaciones y los ficheros sobre los cuales actúa la misma, al presionar la tecla "enter".

Probablemente la shell más popular para Linux sea Bash, basado en la sintaxis de Bourne Shell, con el que se pueden realizar programas usando instrucciones Bash de cierta complejidad, con una estructura muy parecida a otros lenguajes de alto nivel.

Aclarados los conceptos base, vamos a proceder a dar un estilo propio al inicio de sesión de nuestra shell de Linux. La forma más sencilla de hacerlo es personalizando el fichero "/etc/motd" (Message Of The Day). Para ello ejecutamos el siguiente comando:

sudo nano motd

Se nos abrirá o creara el fichero con permisos de usuario. Dentro deberemos poner en texto plano lo que queramos que aparezca, guardar haciendo CTRL+O y salir con CTRL+X. Si andas falto de ideas puedes entrar a este generador de texto ASCII:

http://patorjk.com/software/taag

O a esta galería de imágenes ASCII:

http://www.chris.com/ascii/joan/www.geocities.com/SoHo/7373/index.html

Cuando guardes el fichero, prueba cómo ha quedado abriendo otro terminal y ejecutando el siguiente, le cual abre una sesión ssh de tu usuario contra tu propio equipo:

ssh 127.0.0.1

Pedirá la contraseña de usuario (la introduces) y verás el mensaje. Si no aparece, prueba a salir de la sesión ssh con "exit" y prueba a ejecutar el comando anterior de nuevo. Deberías entonces poder ver tu mensaje.

custom-motd

El MOTD de mi ejemplo podéis encontrarlo en:

https://gist.github.com/RDCH106/876cdb98e7d1b0f3ef22040213a48c40

Si lo que quieres es un mensaje del día más elaborado que no consista en hacer "print" de un texto plano, entramos en "/etc/update-motd.d" y listamos los ficheros con "ls":

update-motd

Se trata de una serie de scripts Bash que poseen una sintaxis especial en el nombre del fichero. Los números que preceden al nombre del fichero, indican el orden en que se ejecutan cuando se inicia una sesión, siendo los números menores los que se ejecutan antes. Estos ficheros a diferencia del "motd" contienen comandos que son ejecutados por el super-usuario "root" y se trata por tanto de ficheros interpretados.

Vamos a crear uno con nombre "20-stats" en el que mostraremos algunas estadísticas del sistema:

sudo nano 20-stats

Y copiamos el siguiente código:

#!/bin/bash

function color (){
  echo "\e[$1m$2\e[0m"
}

function extend (){
  local str="$1"
  let spaces=60-${#1}
  while [ $spaces -gt 0 ]; do
    str="$str "
    let spaces=spaces-1
  done
  echo "$str"
}

function sec2time (){
  local input=$1
  
  if [ $input -lt 60 ]; then
    echo "$input seconds"
  else
    ((days=input/86400))
    ((input=input%86400))
    ((hours=input/3600))
    ((input=input%3600))
    ((mins=input/60))
    
    local daysPlural="s"
    local hoursPlural="s"
    local minsPlural="s"
    
    if [ $days -eq 1 ]; then
      daysPlural=""
    fi
    
    if [ $hours -eq 1 ]; then
      hoursPlural=""
    fi
    
    if [ $mins -eq 1 ]; then
      minsPlural=""
    fi
    
    echo "$days day$daysPlural, $hours hour$hoursPlural, $mins minute$minsPlural"
  fi
}

borderColor=35
headerLeafColor=32
headerRaspberryColor=31
greetingsColor=36
statsLabelColor=33

borderLine="━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
borderTopLine=$(color $borderColor "┏$borderLine┓")
borderBottomLine=$(color $borderColor "┗$borderLine┛")
borderBar=$(color $borderColor "┃")
borderEmptyLine="$borderBar                                                                              $borderBar"

header="$borderTopLine"

uptime="$(sec2time $(cut -d "." -f 1 /proc/uptime))"
uptime="$uptime ($(date -d "@"$(grep btime /proc/stat | cut -d " " -f 2) +"%d-%m-%Y %H:%M:%S"))"

label1="$(extend "$uptime")"
label1="$borderBar  $(color $statsLabelColor "Uptime........:") $label1$borderBar"

label2="$(extend "$(free -m | awk 'NR==2 { printf "Total: %sMB, Used: %sMB, Free: %sMB",$2,$3,$4; }')")"
label2="$borderBar  $(color $statsLabelColor "Memory........:") $label2$borderBar"

label3="$(extend "$(df -h ~ | awk 'NR==2 { printf "Total: %sB, Used: %sB, Free: %sB",$2,$3,$4; }')")"
label3="$borderBar  $(color $statsLabelColor "Home space....:") $label3$borderBar"

stats="$label1\n$label2\n$label3"

# Print motd
echo -e "$header\n$borderEmptyLine\n$stats\n$borderEmptyLine\n$borderBottomLine" 

Guarda haciendo CTRL+O y salir con CTRL+X.

Además vamos a añadir otro script más para personalizar el inicio de sesión del perfil, que lo haremos en "/etc/profile.d" . La razón de hacerlo en profile es debido a que los mensajes MOTD se ejecutan por el root y por ejemplo si hacemos un "whoami" nos devolverá siempre root. Para ello creamos un script "wellcome.sh" que nos saludará y mostrará la fecha y hora:

sudo nano wellcome.sh

Y copiamos el siguiente código:

#!/bin/bash

function color (){
  echo "\e[$1m$2\e[0m"
}

function extend (){
  local str="$1"
  let spaces=60-${#1}
  while [ $spaces -gt 0 ]; do
    str="$str "
    let spaces=spaces-1
  done
  echo "$str"
}

function center (){
  local str="$1"
  let spacesLeft=(78-${#1})/2
  let spacesRight=78-spacesLeft-${#1}
  while [ $spacesLeft -gt 0 ]; do
    str=" $str"
    let spacesLeft=spacesLeft-1
  done
  
  while [ $spacesRight -gt 0 ]; do
    str="$str "
    let spacesRight=spacesRight-1
  done
  
  echo "$str"
}

borderColor=35
headerLeafColor=32
headerRaspberryColor=31
greetingsColor=36
statsLabelColor=33

borderLine="━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
borderTopLine=$(color $borderColor "┏$borderLine┓")
borderBottomLine=$(color $borderColor "┗$borderLine┛")
borderBar=$(color $borderColor "┃")
borderEmptyLine="$borderBar                                                                              $borderBar"

me=$(whoami)

header="$borderTopLine"

# Greetings
greetings="$borderBar$(color $greetingsColor "$(center "Welcome back, $me!")")$borderBar\n"
greetings="$greetings$borderBar$(color $greetingsColor "$(center "$(date +"%A, %d %B %Y, %T")")")$borderBar"

# Print motd
echo -e "$header\n$borderEmptyLine\n$greetings\n$borderEmptyLine\n$borderBottomLine" 

Guarda haciendo CTRL+O y salir con CTRL+X.

Abrimos una sesión ssh de tu usuario contra tu propio equipo, como ya hemos hecho anteriormente, y veremos un inicio de sesión como el siguiente, pero con los datos de tu sesión y equipo.

custom-motd_2

La finalidad de estos MOTD y scripts de perfil, pueden servir para la generación de mensajes informativos concretos para los usuarios, la generación de paneles informativos del sistema para administradores o simplemente para personalizar/corporativizar un sistema Linux.

img_20160414_174706.jpg

Espero que este artículo os haya servido para aprender a explotar estas características tan útiles del inicio de sesión de Linux.

 





4713 Visitas Totales 2 Visitas para Hoy

Deja un comentario