Suoni casuali al log-in

Il presente documento si propone di mostrare come modificare il file /etc/profile per permettere di riprodurre dei suoni ogni volta che si esegue il login.

Prerequisti

  • Per prima cosa occorre rimediare un buon numero di file in formato wav e metterli tutti nella stessa directory. Io ho scelto di porli in /etc/sound/loginuser.
  • Altra cosa che occorre e', ovviamente, un programma che riproduca i file da linea di comando. Io utilizzo wavp, se voi avete altre preferenze fate come volete, l'importante e' averne installato uno. Potete anche scegliere un programma che riproduca file mp3 e riempire la cartella di file in questo formato. Fate come preferite.

Per cominciare

Bene abbiamo i file e abbiamo il programma, non ci resta che aprire /etc/profile col nostro editor preferito e modificarlo. Tale file viene letto dopo ogni log-in e gli script in esso contenuto vengono eseguiti. Portiamoci in fondo al file e scriviamo:

numuser=`ls /etc/sound/loginuser | wc -l`
fileuser=`ls /etc/sound/loginuser/ | tail -n $(( ( $RANDOM % $numuser ) + 1 )) | head -n1`
pathuser=`echo /etc/sound/loginuser/$fileuser`

Vi state chiedendo cosa abbiamo fatto? Ecco la spiegazione.

Abbiamo definito tre variabili: $numuser, $fileuser e $pathuser. $numuser contiene il numero di file in /etc/sound/loginuser e per contarli abbiamo prima eseguito il comando ls, che stampa i file contenuti nella directory e contato le righe col comando wc -l.

$fileuser contiene un file scelto a caso tra quelli presenti nella directory: dopo aver eseguito il comando ls abbiamo "filtrato" il risultato tenendo solo le ultime N righe (con tail -n), dove N e' un numero a caso tra 1 e $numuser ed e' determinato dal valore dell'espressione $(( ( $RANDOM % $numuser ) + 1 ). Infine abbiamo tenuto solo la prima riga di questo elenco col comando head -n1 ottenendo cosi' il nome del file che andremo a riprodurre.

Per riprodurre il file abbiamo pero' bisogno del percorso completo e questo viene definito in $pathuser anteponendo al file scelto il nome della directory.
Bene, ora non ci resta che riprodurre il file cosi' ottenuto e lo facciamo col comando:

`wavp $pathuser >& /dev/null &` >& /dev/null

Vediamo nel dettaglio quest'ultima istruzione: wavp $pathuser e' il comando principale ma se lasciassimo solo questo comparirebbero a schermo fastidiose righe di informazione sul file e sul tempo di riproduzione. Abbiamo quindi rediretto l'output e l'error in /dev/null con >& /dev/null e, in piu', messo il processo in background con & per evitare di dover aspettare la fine della riproduzione per poter utilizzare la shell.

Ma non va ancora bene. Se ci limitassimo a questo una volta riprodotto il suono ci ritroveremmo un messaggio, dopo il primo comando eseguito, che ci informerebbe che il processo e' giunto a termine. Vogliamo eliminare anche questo e per farlo racchiudiamo quanto scritto fin'ora tra apici e redirigiamo nuovamente l'output e l'error in /dev/null.
ET VOILA'!!!

Ma non finisce qui...

Bello, funziona ci piace. Ma possiamo migliorarlo.
Supponiamo ora di voler riprodurre dei file diversi se ci loggiamo come root. Come modificare lo script?

Basta creare una nuova directory contenente i file voluti, per esempio /etc/sound/loginroot, e nel codice aggiungere una condizione if che verifichi se l'utente che sta eseguendo lo script sia o no root. In caso affermativo le operazioni descritte sopra andranno eseguite nella nuova directory.

if test `whoami` = "root" ; then
   numroot=`ls /etc/sound/loginroot | wc -l`
   fileroot=`ls /etc/sound/loginroot/ | tail -n $(( ( $RANDOM % $numroot ) + 1 )) | head -n1`
   pathroot=`echo /etc/sound/loginroot/$fileroot`
   `wavp $pathroot >& /dev/null &` >& /dev/null
else
   numuser=`ls /etc/sound/loginuser | wc -l`
   fileuser=`ls /etc/sound/loginuser/ | tail -n $(( ( $RANDOM % $numuser ) + 1 )) | head -n1`
   pathuser=`echo /etc/sound/loginuser/$fileuser`
   `wavp $pathuser >& /dev/null &` >& /dev/null
fi

Come avete visto il meccanismo e' facile e puo' essere riciclato per inserire suoni casuali anche in occasione di altri eventi.

by Aladino
Mail: geniodelmale@hotpop.com