Abbiamo già visto come si possono ridefinire le variabili d'ambiente del sistema operativo. Ma queste non sono le uniche variabili messe a disposizione dell'OS.
In un qualsiasi momento è possibile definire, per scopi propri, una propria variabile.
Le variabili sono nomi composti di caratteri alfanumerici,
generalmente esse nella loro interezza vengono indicate
semplicemente dal loro nome, mentre il loro contenuto
si indica con il nome preceduto dal carattere ``$
''.
Ad esempio
QUESTAVARIABILE="proviamo se funziona"
Per vedere il contenuto della variabile QUESTAVARIABILE, possiamo utilizzare ad esempio il comando
echo
nella forma
echo $QUESTAVARIABILE
che ci dà come output
proviamo se funziona
Se avessimo scritto semplicemente
echo QUESTAVARIABILE
avremmo avuto come output semplicemente
QUESTAVARIABILE
perché non avremmo referenziato il contenuto della variabile in questione, ma semplicemente il suo nome.
Attenzione all'uso delle virgolette. Le virgolette infatti hanno per così dire una funzione di protezione degli argomenti.
Infatti la shell in mancanza delle virgolette interpreta una linea come un comando seguito da una serie di argomenti, ad esempio se noi utilizziamo la seguente forma
QUESTAVARIABILE=proviamo se funziona
avremmo un output del tipo:
bash: se: command not found
proprio perché il se
verrebbe interpretato non come parte
della stringa che si vuole assegnare alla variabile, ma come
parte di un comando, che ovviamente non esiste.
L'uso delle variabili può risultare molto comodo, specialmente quando incominceremo ad occuparci della programmazione degli script. Per ora ne mostreremo solo alcune interessanti applicazioni.
Ad esempio, una variabile può contenere non solo nomi e stringhe, ma un file intero o il contenuto di una directory, vediamo come:
FACCIAMOUNAPROVA=`cat /etc/HOSTNAME`
questo significa che voglio assegnare alla variabile in
questione l'output del comando cat /etc/HOSTNAME
,
il fatto che a FACCIAMOUNAPROVA
venga assegnato il
risultato di un comando anziché la stringa
``cat /etc/HOSTNAME
'' dipende dall'uso dell'operatore
accento grave, che appunto assolve a questa funzione.
L'operatore accento grave si ottiene con la combinazione di tasti ALT 96 (96 deve essere digitato dal tastierino alfanumerico). Facendo
echo $FACCIAMOUNAPROVA
otterrei appunto
bilbo.comeon.org
che è il contenuto del file /etc/HOSTNAME
.
L'operatore accento grave riveste una notevole importanza e può essere usato in molto casi e/o applicazioni.
Come già visto serve ad usare il risultato di un comando come input per una variabile d'ambiente oppure per un altro comando. Vediamone qualche esempio:
MIAVAR="Il file prg.culturale.1 contiene "`cat \
prg.culturale.1|wc -w`" parole"
echo $MIAVAR
Il file prg.culturale.1 contiene 2237 parole
vediamo quello che è successo
MIAVAR
`
stdout
il contenuto del file prg.culturale.1
con il comando cat
cat
(ovvero il file da visualizzare) è
prg.culturale.1
cat
viene usato come input dal filtro wc -w
che conta il numero delle parole presenti nel suo input,
la redirezione si fa con |
(pipe)cat
a cui è stato applicato il filtro
wc
.Può sembrare difficile, o complicato, anche perché l'uso delle pipe e di alcuni filtri non è stato ancora approfondito, seppure vi sia stato qualche accenno nel primo capitolo.
In realtà non lo è affatto, una volta che avrete preso la mano con questo genere di filosofia, vi verrà tutto molto spontaneo e scontato.
Per quanto riguarda l'uso dei filtri e della pipe, questo esempio è stato messo apposta, perché pur se in seguito approfondiremo maggiormente questi argomenti, riteniamo che sia opportuno fin da ora cominciare a fare l'abitudine a questo tipo di concatenazione fra i comandi.
Vediamo qualche altro esempio.
L'esempio seguente calcola e stampa la percentuale di quote in un messaggio. La forma e la quantità delle istruzioni è stata volutamente resa più complessa di quanto poteva essere, al fine di mostrare come possono interagire fra loro comandi redirezione dell'input e dell'output
grep -i . msg > result;TOTL=`cat result|wc -l`;TOTQ=`grep -i ">" \
result|wc -l`;echo "( $TOTQ / $TOTL ) "*" 100"|bc -l|cut -f1 -d'.'\
> quotes; QUOTEPER=`cat quotes`
Il messaggio originale era il seguente:
Ciao Pako.
Il 08 Jan 96, Pako scrive a Eraldo Corti:
:>> C'è qualcuno???
:>> Esiste quest'area???
P> heilà! Benvenuto...
grazie...
P> ti invitiamo a far chiasso finché non arrivano i cd e partirà il
P> prog. culturale... beninteso che chiasso=discussioni di qualunque
P> tipo su Linux e ComeOn Linux!
certo... Provvederò...
Ciao. @:) Eraldo.
grep -i . msg
provvede ad eliminare dal file le
linee bianche> result
invia al file result l'output di
grep
, privato dalle linee bianche;
separa due comandi differentiTOTL=`cat result|wc -l`
viene assegnato
il numero totale delle linee componenti il file, ottenuto filtrando con
wc
il file result
;
separa due comandi differentiTOTQ=`grep -i ">" result|wc -l`
viene assegnato il numero totale delle linee quotate, ove per quotate si
intendono le linee che contengono il simbolo gt;
, filtrate dal file
result
attraverso l'operatore grep
e ulteriormente filtrate dal
filtro wc
.;
separa due comandi differentiecho "( $TOTQ / $TOTL ) "*" 100"|bc -l|cut -f1 -d'.'
in output va l'operazione da compiere, ovvero il totale delle linee
quotate diviso per il totale delle linee tutto moltiplicato 100, tale
output va come input alla calcolatrice bc
che ne elabora il
risultato, il risultato infine viene tagliato dalla virgola, qualora fosse
un numero decimale.gt; quotes
, il risultato ottenuto viene stampato nel
file quotes
quotes
viene attribuito alla variabile
QUOTEPER
A questo punto la variabile QUOTEPER
può essere utilizzata
ad esempio in output ad un programma che fa le statistiche sul
quoting dei messaggi:
echo "Il messaggio msg contiene il $QUOTEPER % di linee quotate"
Come si vede, gli esempi in questa sezione sono volutamente
accentuati, ma rappresentano un buon punto di partenza per
lo studio dei vari operatori di redirezione e di pipe, nonché
danno un accenno sull'uso di alcuni filtri, quali ad esempio
wc
, cut
e grep
.
Un buon esercizio sarebbe quello di rendere in forma più semplice questi ultimi due esempi.
alias
In /etc/profile
abbiamo visto anche la presenza di un
comando alias
.
alias
è un utilissimo strumento che consente in maniera
semplice, ma molto efficace, di personalizzare ulteriormente
il sistema operativo.
In pratica tramite il comando alias è possibile ridefinire il nome e la funzione di comandi originali, oppure di crearne di nuovi più sofisticati.
Es: alias l='ls -l'
aggiungendo questa riga in /etc/profile
avrete creato il
nuovo comando l
che ha la funzione di visualizzare una
lista lunga delle directory.
alias shut='shutdown -t15 -hfn now'
questo fa sì che abbiate creato il nuovo comando shut
,
che esegue uno shutdown della macchina.
alias rm='rm -i'
in questo modo avrete ridefinito il comando rm
,
facendo in modo che vi chieda ogni volta conferma per
la cancellazione di un file
alias untgz='tar -zxvf'
Crea il comando untgz
, che scompatta i file in
formato tgz
. Ovvero untgz nomefile.tgz
.
Si potrebbe continuare con moltissimi altri esempi, ma credo che ormai abbiate capito l'utilità del comando.
adduser
Bene è arrivato il momento di aggiungere un nuovo utente al mio sistema. La
cosa può essere fatta sia manualmente che sfruttando un comando del sistema
operativo. Il comando in questione è appunto: adduser
.
Supponiamo ad esempio che il mio primo utente sia un utente specializzato a leggere e/o scrivere la posta.
Naturalmente dovrà avere accesso a tutti i comandi che servono per realizzare il suo scopo, ma non dovrà poter accedere ai dati di un altro utente del sistema (ad esempio un user loggato al mio sistema, che non avrebbe piacere che un altro utente anche lui specializzato a leggere la posta, che non avrebbe piacere che qualche altro leggesse la sua posta personale).
Inoltre deve poter accedere a 2 o 3 directory condivise con altri utenti, dove vengono mantenute informazioni generali che potrebbero essere utili per rispondere ai messaggi.
La procedura è la seguente:
adduser
Adding a new user. The username should not exceed 8 characters
in length, or you may run into problems later.
Enter login name for new account (^C to quit): wiz
Editing information for new user [wiz]
Full Name: Giuseppe De Marco
GID [100]: 14
Group 'uucp', GID 14
First unused uid is 507
UID [507]:
Home Directory [/home/wiz]:
Shell [/bin/bash]:
Password [wiz]: "azteca" (tipicamente la password ha un limite
di 8 caratteri, password più lunghe
vengono di solito troncate)
Adding the files from the /etc/skel directory:
./.kermrc -> /home/wiz/./.kermrc
./.less -> /home/wiz/./.less
./.lessrc -> /home/wiz/./.lessrc
./.term -> /home/wiz/./.term
./.term/termrc -> /home/wiz/./.term/termrc
Vediamo ora di spiegare quanto abbiamo fatto.
In realtà il comando adduser
è un interfaccia, che
crea la seguente riga nel file /etc/passwd
:
wiz:DhhywZZ0oHu56:507:14:Giuseppe De Marco:/home/wiz:/bin/bash
inoltre crea la home dell'utente e delle directory e dei file standard
(definiti dal superuser) copiandoli dalla dir /etc/skel
.
Il file /etc/passwd
contiene l'elenco degli utenti riconosciuti dal
sistema. Nessun utente potrà loggarsi al sistema se non sarà elencato in
questo file.
Ciascuna voce all'interno del file /etc/passwd
, sarà così
composta:
LOGINNAME:PWD:USERID:GROUPID:UNASTRINGA:HOMEDIR:SHELL
LOGINNAME
indica il nome che l'utente userà per loggarsi al sistema. Noi abbiamo
inserito ad esempio ``wiz
''
PWD
contiene una password per l'utente in questione. Tipicamente la password
viene inserita in una forma codificata (come nell'esempio di cui sopra). Il
campo password puo' anche essere lasciato in bianco. (se vi fidate :-)
)
Potete mettere anche *
come password, questo significa che l'utente in
questione non sarà accessibile a nessuno se non tramite il comando su.
Il file /etc/passwd è tipicamente accessibile in lettura a tutti gli utenti,
quindi se pur codificata, l'esistenza della password potrebbe rappresentare
un problema. I più pignoli per risolvere questo usano usare un metodo detto
shadow, ovvero nel campo passwd si mette una x
, e le password
vengono conservate in un file /etc/shadow
, non accessibile a tutti
(in realtà il problema delle shadow password è molto più complesso, ed ha
affollato i vari newsgroup su internet per un bel pezzo, perciò se
volete saperne di più consiglio di leggere comp.os.linux.*
).
USERID
è un numero fra 0 e 65535 che identifica l'utente. Nel file
/etc/passwd
tale numero non deve essere ripetuto per identificare
più utenti.
GROUPID
contiene il numero del gruppo di cui l'utente fa parte (in questo modo si definiscono i livelli di accesso, ma di questo parleremo in seguito).
UNASTRINGA
un commento, tipicamente il nome per esteso dell'utente o la funzione in cui è specializzato.
HOMEDIR
contiene il percorso completo della dir che verrà usata come home dall'utente in questione.
SHELL
un qualsiasi programma eseguibile, che verrà eseguito subito dopo il login.
Tipicamente l'interprete dei comandi (bash
, ksh
o qualsiasi
altra).
Quando l'utente wiz
tenterà di accedere al sistema verrà fatto un
controllo sul file /etc/passwd
, se il suo nome e la sua password
coincidono con quelli utilizzati al login, l'utente avrà accesso al
sistema altrimenti ne rimarrà fuori.