Ho cercato per parecchio tempo di riuscire a scrivere un file /etc/issue che risultasse colorato per la mia macchina, dopo aver scoperto la bellezza dei terminali colorati (con Bash Prompt Howto e Colour ls mini howto), ma mi sono trovato a dover combattere con diversi problemi.
Prima di tutto, la mancanza di informazioni: nessuno sapeva come editare il file /etc/issue per ottenere un testo colorato e nemmeno sapevano dirmi dove cercare!!
Finalmente sono riuscito a procurarmi un /etc/issue di una distribuzione, Mandrake 7, che lo ha colorato (c’è il logo del mitico Tux) e mi sono messo a studiarlo, però mi sono trovato di fronte prima a dei codici di escape che non sapevo come scrivere su file (per eseguire /etc/issue viene usata sh che non riconosce il \033* e va usato il codice di escape ^[) e soprattutto dei codici che non sapevo cosa facessero e di cui non trovavo spiegazioni da nessuna parte.
Armato di pazienza (e di wget) ho scaricato tutti gli howto disponibili su ILDP e con un grep ho cercato se c’erano riferimenti all’argomento che mi interessava.
Alcuni riferimenti li ho trovati, ma sono proprio essenziali, quindi ho deciso di riunirli ed ampliarli per avere una visione d’insieme più chiara.
Innanzitutto dobbiamo imparare quali sono i colori disponibili. Questo qui sotto è uno script (tratto dal Bash Prompt HOWTO) che ci mostra a video alcuni dei colori che potremo usare con i relativi codici.
#!/bin/bash # Questo file stampa molti codici-colore sul terminale per # mostrare quali sono disponibili. Ogni linea e` un colore su sfondo # nero o grigio, con il colore nel mezzo. E` verificato che funziona con # sfondo bianco, nero e verde (2 dic 98). # echo " On Light Gray: On Black:" echo -e "\033[47m\033[1;37m White \033[0m\ 1;37m \ \033[40m\033[1;37m White \033[0m" echo -e "\033[47m\033[37m Light Gray \033[0m\ 37m \ \033[40m\033[37m Light Gray \033[0m" echo -e "\033[47m\033[1;30m Gray \033[0m\ 1;30m \ \033[40m\033[1;30m Gray \033[0m" echo -e "\033[47m\033[30m Black \033[0m\ 30m \ \033[40m\033[30m Black \033[0m" echo -e "\033[47m\033[31m Red \033[0m\ 31m \ \033[40m\033[31m Red \033[0m" echo -e "\033[47m\033[1;31m Light Red \033[0m\ 1;31m \ \033[40m\033[1;31m Light Red \033[0m" echo -e "\033[47m\033[32m Green \033[0m\ 32m \ \033[40m\033[32m Green \033[0m" echo -e "\033[47m\033[1;32m Light Green \033[0m\ 1;32m \ \033[40m\033[1;32m Light Green \033[0m" echo -e "\033[47m\033[33m Brown \033[0m\ 33m \ \033[40m\033[33m Brown \033[0m" echo -e "\033[47m\033[1;33m Yellow \033[0m\ 1;33m \ \033[40m\033[1;33m Yellow \033[0m" echo -e "\033[47m\033[34m Blue \033[0m\ 34m \ \033[40m\033[34m Blue \033[0m" echo -e "\033[47m\033[1;34m Light Blue \033[0m\ 1;34m \ \033[40m\033[1;34m Light Blue \033[0m" echo -e "\033[47m\033[35m Purple \033[0m\ 35m \ \033[40m\033[35m Purple \033[0m" echo -e "\033[47m\033[1;35m Pink \033[0m\ 1;35m \ \033[40m\033[1;35m Pink \033[0m" echo -e "\033[47m\033[36m Cyan \033[0m\ 36m \ \033[40m\033[36m Cyan \033[0m" echo -e "\033[47m\033[1;36m Light Cyan \033[0m\ 1;36m \ \033[40m\033[1;36m Light Cyan \033[0m"
Qui sotto invece riporto una tabella riassuntiva dei codici di colore che potremo usare nel /etc/issue
Colori in primo piano
| Colore Scuro | Codice | Colore chiaro | Codice |
| Nero | 0;30 | Grigio Scuro | 1;30 |
| Blu | 0;34 | Blu Chiaro | 1;34 |
| Verde | 0;32 | Verde Chiaro | 1;32 |
| Ciano | 0;36 | Ciano Chiaro | 1;36 |
| Rosso | 0;31 | Rosso Chiaro | 1;31 |
| Viola | 0;35 | Viola Chiaro | 1;35 |
| Arancio | 0;33 | Giallo | 1;33 |
| Grigio Chiaro | 0;37 | Bianco | 1;37 |
Colori di sfondo
| Colore | Codice | Colore | Codice |
| Nero | 37;40 | Blu | 37;44 |
| Verde | 37;42 | Ciano | 37;46 |
| Rosso | 37;41 | Viola | 37;45 |
| Marrone | 37;43 | Grigio Chiaro | 37;47 |
La forma normale per un colore è \[\033[1;31m\] dove \[ introduce una sequenza di caratteri non stampabili, \033 indica che quello che segue è il codice del colore e \] chiude la sequenza di caratteri non stampabili.
Questi colori solitamente (per esempio in bash) possono essere usati insieme, ad esempio: \[\033[44;1;36m\] per avere fondo blu e testo ciano chiaro.
Nel Bash-Prompt-HOWTO si segnala che la sequenza \[\033[44m\]\[\033[1;31m\] sembra funzionare meglio.
Nella distribuzione Linux RedHat? il file /etc/rc.d/rc.local sovrascrive ad ogni avvio il file /etc/issue e /etc/issue.net, quindi, se vogliamo che le nostre modifiche siano permanenti, dovremo editare il file /etc/rc.d/rc.local oppure togliere da quel file le istruzioni che cancellano /etc/issue.
La stessa cosa vale per il file /etc/rc.d/rc.S nella Slackware.
Io vi consiglio la prima ipotesi (modificare /etc/rc.d/rc.local) perché essendo uno script di shell potremo utilizzare variabili ed altre comodità.
Per prima cosa mettiamo nel file /etc/rc.d/rc.local la variabile:
ESC="^["
Dove ^[ è fatto con (^V significa CTRL+V):
emacs: ^Q ESC vi: ^V ESC joe: ` 0 2 7 jed: ` ESC
Subito dopo possiamo passare a mettere le variabili dei colori in questa forma:
BLU="${ESC}[0;34m"
CIANO="${ESC}[0;36m"
LCIANO="${ESC}[1;36m"
GRIGIO="${ESC}[0;37m"
BGBLUE="${ESC}[37;44m"
NORMAL="${ESC}[37;0;40m"
CLEAR="${ESC}[H${ESC}[J"
Per poi passare ad editare la parte più importante, in cui viene effettivamente creato il file:
echo "${CLEAR}" > /etc/issue
Con questa prima riga ci assicuriamo che i colori vengano visualizzati correttamente (in pratica porta il cursore in alto a sinistra, e ripulisce il resto dello schermo, preparandolo alla visualizzazione dei colori).
Nelle righe successive possiamo sbizzarrirci:
echo "${CIANO}Questo e\' un testo color ciano" >> /etc/issue
Qui per esempio aggiungiamo una frase "Questo e' un testo color ciano" alla fine di /etc/issue (il doppio simbolo > indica di aggiungere).
Da notare che ci riferiamo alla variabile con ${CIANO} e non $CIANO per evitare problemi di escaping (es. $CIANOQuesto - la variabile non viene riconosciuta).
Consiglio di lasciare alla fine un echo "${NORMAL}" >> /etc/issue in modo che ci sia una linea di separazione tra l’ultima riga del nostro issue e la richiesta di login e che il testo successivo appaia normale.
Fatte queste semplici operazioni, al prossimo avvio avremo un issue colorato che ci saluterà in modo meno monotono del solito localhost login: in un triste bianco e nero.
Essendo, come abbiamo detto, il file rc.local uno script di shell, possiamo utilizzare anche variabili di altro tipo, ad esempio per avere l’hostname completo:
HOSTNAME=$(hostname --long)
Per avere l’IP
IPADDR=$(hostname -i)
Per avere le informazioni di uptime
UPTIME=$(uptime)
Per avere il nome e la versione del sistema operativo
OS=$(uname -sr)
Per avere il tipo di macchina (intel, alpha etc.) ed il processore.
HARDWARE=$(uname -mp)
E così via… un altro esempio è quello (contenuto in /etc/rc.d/rc.local di RedHat? 6.0) di leggere un file:
if [ -f /etc/redhat-release ]; then
RELEASE=$(cat /etc/redhat-release)
fi
In modo da avere il contenuto del file /etc/redhat-release nella variabile ${RELEASE}
E’ molto interessante per esempio il cat sui vari files del file system virtuale /proc :
BOGOMIPS=$(cat /proc/cpuinfo | grep bogomips) MHZ=$(cat /proc/cpuinfo | grep MHz) MEMORY=$(cat /proc/meminfo | grep MemTotal)
Scatenate la vostra fantasia! :)
In uno script di shell anche i caratteri di escape sono molto utili, ed essendo bash e sh quasi compatibili, ecco alcuni dei caratteri di escape di bash (che, però, potrebbero non funzionare, in sh… provate, provate, provate)
| escape | significato |
| \a | il carattere ASCII beep (07) |
| \d | la data nel formato “Giorno-della-settimana Mese Data” (es. “Tue May 26”) |
| \e | un carattere di escape ASCII (033) |
| \h | l’hostname fino al primo . (hostname “corto”) |
| \H | l’hostname completo |
| \n | il carattere “newline” |
| \r | il carattere “carriage return” |
| \s | il nome della shell, il nome base di $0 (la parte che segue lo slash finale) |
| \t | l’ora corrente nel formato 24-ore HH:MM:SS |
| \T | l’ora corrente nel formato 12-ore HH:MM:SS |
| \@ | l’ora corrente nel formato 12-ore am/pm |
| \u | lo username dell’utente corrente |
| \v | la versione di bash (e.g., 2.00) |
| \V | la release di bash, versione + patchlevel (es. 2.00.0) |
| \w | la directory di lavoro corrente |
| \W | il nome di base della directory di lavoro corrente |
| \! | il numero cronologico (history number) di questo comando |
| \# | il numero di questo comando |
| \$ | se l’UID effettivo è 0, un #, altrimenti un $ |
| \nnn | il carattere corrispondente al numero ottale nnn |
| \\ | un backslash |
| \” | una doppia apice |
| \’ | una singola apice |
Alcune di queste sequenze di escape non hanno nessuna utilità in un /etc/issue ma le ho riportate per completezza. Inoltre ricordate che gli escape che riguardano il tempo verranno scritti nel file issue e non interpretati, quindi il tempo visualizzato è quello dell’ultimo boot, non quello attuale.