Commenti sull’Info Age

Diari sull’informatica e dintorni

Archive for the ‘unix script’ Category

La guida galattica alle Unix Shell parte 3: Script Warm Up

Posted by orter su novembre 13, 2007

Le nostre mani sullo Unix Scripting

Shell Script Warm Up.

Piccolo riassunto delle parti componenti questa guida:

Parte 1. Perchè esistono le shell.
Parte 2. I primi esperimenti con i comandi Unix.
Parte 3. Script Warm Up.

Per imparare velocemente occorre fare domande, queste sono le più comuni:

Ma io come scrivo le shell script?

Utilizzando l’editor preferito! Che sia il vecchio, ma sempre verde, VI, che sia EMACS o i più prosaici KWrite, Kate, Gedit va bene lo stesso. Scegliete una cartella dove salvare la script (fare una sottodirectory della propria home va benissimo) ed iniziate a lavorare. Un unica accortezza: dopo aver salvato la prima volta la shell, proprio prima del primo lancio, sulla linea di comando digitare

chmod 744 nomeshell.

In questo modo potete lanciare la shell digitando

./nomeshell

il ./ non è un errore di battitura, ce lo dovete mettere.

Ma io come lancio le shell script?

Leggendo il punto precedente dovrebbe essere chiaro: da una shell occorre entrare nella cartella dove c’è la script e lanciarla con ./nomeshell dopo averne cambiato le permission. Una alternativa è lanciare la shell digitando: bash ./nomeshell (in Linux) o ksh ./nomeshell (in AIX e HP/UX) o csh ./nomeshell se siete tra i pochi che usano la c shell. Sì, è pure possibile lanciare la shell da un Window Manager, ma non è pratico per il debugging.

Quali sono gli interpreti disponibili, (ovvero, nello slang dei secchioni, le shell disponibili)?

Brutta notizia: in ambiente Unix non c’è un unico linguaggio script, ci sono vari interpreti e quindi vari dialetti. Buona notizia: i più usati sono due: in ambiente Linux la Bash (che a volte nele guide è semplicemente chiamata sh), in ambiente Aix (lo Unix di IBM) e HP/Ux (lo Unix di Hp) la Ksh (la Korn Shell, disponibile comunque anche per Linux, ma non è spesso inclusa nelle distribuzioni, va installata).

Ci sono altri linguaggi script diffusi: c’è csh che deriva dal linguaggio c, la sh classica (Bash sta per Bourne Again Shell, è un riscrittura della sh). Ma i sono anche il Perl ed il Tcl, che permettono potenza ed affidabilità.

Come faccio a capire quale interprete sto usando?

Bella domanda! Digitare dal promt di comando

 env | grep SHELL

Questo vi dirà quale shell è il default dell’utenza. Se si lancia una script questa verrà interpretata dall’interprete di default. A meno che non si lanci esplicitamente lo script con i comandi:

 ksh ./nomeshell

o

 sh ./nomeshell oppure  bash ./nomeshell

E’ anche possibile indicare quale interprete si vuole adoperare all’interno della shell stessa inserendo come prima riga del codice

#!/bin/nomeiterprete (esempio #!/bin/bash).

Quali sono i comandi di una shell script?

Sono tutti i comandi Unix ed alcuni ‘controllori di flusso’. In Informatica i controllori di flusso sono le istruzioni condizionali ed i cicli.

E adesso finalmente….

La prima shell: hello World

E’ tradizione, questa è la shell:

#!/bin/bash echo "Hello World"

Variabili

Le variabili possono avere nomi composti da caratteri alfanumerici, ma devono iniziare con caratteri alfabetici. Vanno bene variabili come foo, pippo, andrea, lucano, tina132, ma non 2ina.
Per valorizzare una variabile basta porre nomevariabile=valore, esempio foo=”ciccio formaggio” oppure foo = 1. I valori numerici non sono compresi tra doppi apici, quelli testuali sì.
Per leggere il valore di una variabile basta premettere alla medesima il carattere $. Quindi:

foo="ciccio formaggio" echo $foo

mostra a video…. ciccio formaggio.

Variabili speciali

E’ possibile passare dei parametri alla script: ovvero chiamare la shell così

./miashell par1 par2 par3

Per capire basta guardare questo esempio. Questo è il testo della script stampaparametri.sh

#!/bin/bash  echo "Primo parametro:" $1

echo "Secondo parametro:" $2echo "Terzo parametro:" $3

echo "Hai inserito " $# " parametri"

Lanciando

./stampaparametri.sh cuccu ruccucu paloma

si ottiene

cuccuruccucupaloma

3

Quindi è abbastanza chiaro che la variabile $1 è la prima stringa che segue il nome della shell nel richiamo, $2 la seconda, ecc. La variabile $# fornisce il numero di parametri passati. Una curiosità: $0 è valorizzato….con il nome della shell.

Istruzioni condizionali (e concatenamento delle istruzioni).

Danno la possibilità di condizionare l’esecuzione di alcune istruzioni. Per esempio, se si vuole copiare il particolare file dalla cartella /var/log/scrollkeeper.log alla /tmp, ma solo se quest’ultimo esiste, si può scrivere questa script:

#!/bin/bashif [ -f /var/log/scrollkeeper.log ]then

cp /var/log/scrollkeeper.log /tmp

else

echo "Impossibile copiare"

fi

Quindi il formato delle istruzioni condizionali è

if [ condizione ]   thenistruzioni da eseguire se la condizione è vera

else

istruzioni da eseguire se la condizione è falsa

fi

Attenzione, then deve andare a capo, oppure è possibile scrivere così:

if [ condizione ];then

Per cui ‘;’ è alternativo all’andata a capo per indicare all’interprete che può considerare l’istruzione finita. Si possono concatenare più istruzioni separandole con ‘;’ se si vuole scrivere codice illegibile. Per esempio:

echo "tre";echo "due"; echo "uno"; echo "sciacquone!!".

Le condizioni (i secchioni li chiamano test) che si possono mettere nella if sono molteplici. Il test appena visto verifica la presenza di un file. Questo

if [ -d /tmp ]

verifica la presenza di directory. Naturalmente è possible confrontare numeri e stringhe, per esempio:

#!/bin/bashset $pippo="ciao"if [$pippo="ciao"];then

echo "ciao ciao"

else

echo "maleducato"

è una shell che, una volta lanciato stampa a video la stringa “ciao ciao”. Il carattere ‘=’ serve a confrontare stringhe, ma anche numeri:

#!/bin/bashset $pippo=1if [$pippo=1];then

echo "ciao ciao"

else

echo "maleducato"

Per confrontare numeri, la Bash, oltre all’operatore ‘=’, accetta anche l’operatore ‘-eq’:

#!/bin/bashset $pippo=1if [$pippo-eq1];then

echo "ciao ciao"

else

echo "maleducato"

Attenzione: occorre rispettare le spaziature (o l’assenza di spaziature indicata nell’esempio.
Non è corretto scrivere:

if [$pippo -eq 1];then

Gli operatori di confronto utilizzabili sono = < > e -eq (sta per =) -gt (sta per >) -lt (sta per <) -ge (sta per =>) -le (sta per =<). In ksh è obbligatorio utilizzare -ge, -le, -gt, -lt, -eq per i valori numerici e =, >, < per le stringhe.

Cicli e ricicli (ma non bicicli).

Per terminare questa sezione del manuale ecco un esempio di script che usa un ciclo:

#!/bin/bashwhile truedo

echo "pippo"

done

Se la lanciate dovrete terminarla con la pressione dei tasti ctrl+c. Naturalmente while può essere seguito da un test uguale a quelli usati per le istruzioni condizionali.
Ma, come nei cartoni animati, nei telefilm e negli articoli (ma mai nei film porno) si vedrà tutto la prossima volta.

Posted in unix script | 4 Comments »

La Guida Galattica alle Unix Shell: parte 2 — I primi esperimenti con i comandi Unix

Posted by orter su giugno 19, 2007

hacker.jpg

Piccolo riassunto delle parti componenti questa guida:

Parte 1. Perchè esistono le shell.
Parte 2. I primi esperimenti con i comandi Unix.
Parte 3. Script Warm Up.

Nella puntata precedente….il xchè delle script unix, la lista dei comandi + comuni (avete notato il linguaggino giovane da sms, very cool vero? Merito una citazione da Repubblica?).

In questa breve puntata, si incomincia a pacciolare (dal dialetto veneto razzolare, in senso lato pasticciare, manipolare, azionare con spirito di studio e/o sperimentazione) con i comandi stessi. Perchè per fare script solide (o semplicemente utili) occorre saper funzionare i comandi.

Il motto è niente teoria, solo pratica e quindi ci spariamo alcuni esempi:

Lista dei file nascosti in una directory: ls -al

Lista di solo subdirectory: ls -d

Lista di file ordinati per data di variazione ascendente (cioè dai file più vecchi ai più recenti): ls -altr

Ricercare la stringa “mammaliturchi” all’interno dei file contenuti in una directory: grep mammaliturchi ./*

Cercare un file chiamato “vivamammozzo” a partire dalla root: find / -name vivamammozzo. Attenzione però, lanciando questo comando potreste ricevere alcune segnalazioni di errore tipo “Cannot Open File/Directory” anche se siete root (neanche root riesce ad aprire file temporanei gestiti dai processi). Ignorateli.

A questo punto dovrebbe essere chiaro che alcuni caratteri particolari permettono di accedere a directory particolari

/ è root. La directory su cui sono mantate tutte le altre cartelle.

. è la directory corrente (se non vi ricordate qual’e’ usate il comando pwd)

.. è la directory padre nell’albero delle dir.

Altri esempi:

Cercare lo stesso file a partire dalla dir “miadir”: find miadir -name vivamammozzo

Cercare nella solita dir miadir un file che non ha avuto accesso (in lettura o scrittura) da 2 giorni: find miadir -type f -atime +2.

Ricercare un file creato o modificato da due giorni nella cartella miadir: find miadir -type f -mtime +2.

Find è un comando iteratore, ovvero, eseguendo le ricerche, può eseguire anche dei comandi su ogni file/directory trovato: find miadir -name ‘*’ -type f -exec rm -f {} \;

E’ bene commentare il comando precedente: si chiede di ricercare nella cartella miadir un oggetto che si chiama ‘*’ (qualunque file o cartella). L’oggetto deve essere di tipo f (ovvero un file). Per ciascuno di questi oggetti si esegue il comando rm -f (cancella senza richiedere conferma). Le lettere {} \; servono a chiudere il comando, usatele così come sono quando vi scappa di utilizzare l’opzione -exec. Altri esempi :

find miadir -name ‘*’ – atime +2 -type f -exec rm -f {} \;

find miadir -name ‘*’ -type f -exec pg {} \; (pg stampa il file a video).

Nella prossima puntata: la base della programmazione script!

Posted in unix script | 3 Comments »

La Guida Galattica alle Unix Shell: parte 1 — Perchè esistono le shell

Posted by orter su giugno 12, 2007

hacker495.jpg

Piccolo riassunto delle parti componenti questa guida:

Parte 1. Perchè esistono le shell.
Parte 2. I primi esperimenti con i comandi Unix.
Parte 3. Script Warm Up.

E adesso: la guida.

Visto che c’è chi ridacchia sugli Shell Writers, onore vuole che si renda la pariglia sul versante command line only.

Vi sentite veri/e uomini/donne, siete pronti ad andare dove nessuno è mai andato prima? Bene, prenotate una gita al vostro villaggio vacanze preferito, stampate la magnifica “Guida Galattica alle Unix Shell” e leggetela con gusto.

Come prima cosa viene da chiedersi: nell’era delle finestre vibranti perchè qualcuno scrive shell script? La risposta viene da un’osservazione attenta di quello che fanno alcune delle applicazioni finestrate più gettonate, per esempio aptude. Se clikkate sul tasto “Advanced” durante una installazione vi trovate di fronte a veloci linee che scrollano liente sulla vostra finestrina. Quelle linee sono “linee di comando”. Se voi copiaste quelle linee su di una console, riuscireste a scaricare i vostri programmi senza utilizzare le finestre (piroettanti o meno), degustando il piacere di essere anche voi degli script makers!

Le script utilizzano comandi che potete digitare sulla Linux console, quindi una guida, per quanto breve, non può esimersi dall’enumerare i comandi più utili. Ma prima…come si lancia una Linux Console? Da GNOME andate sul menù applicazioni > system > console. Su KDE menu Applicazioni>Accessories>Terminal.

La console KDE può essere settata per essere trasparente, avere vari colori, sfondi, ecc, ecc. Sbizzarritevi, io personalmente la uso così:

Comunque, ecco una guida ai comandi essenziali:

Comandi di Base -Ambiente UNIX

Indice

Introduzione all’uso
Gestione files, directories e dischi
Gestione dei diritti di accesso
Gestione dei processi
Ricerca e gestione dei file

Introduzione all’uso

Unix è un sistema basato su terminali grafici e testuali. Un ambiente Unix ne implementa normalmente 6.
Per navigare tra i terminali occore digitare CTRL+ALT+[Tasto Funzione]. L’accesso è permesso inserendo ID e password.
Esiste un’utente particolare che ha id fisso

root

che amministratore del sistema.
Unix è CASE SENSITIVE, i comandi sono in minuscolo.


Per avere informazioni su di un particolare comando:

man numerocapitolo nomecomando

dove nomecomando è il comando di cui volete spiegazioni e numerosezione è il capitolo che intendete leggere. Oppure:

whatis  nomecomando

apropos  nomecomando

info  nomecomando

Gestione files, directories e dischi

In che directory sono?

pwd

ritorna la directory corrente.


Lista files e directories:

ls -opz nomedirectory

restituisce la lista dei files contenuti nella directory corrente.
Opzioni:
-a mostra files e dir nascoste
-l mosta permessi, proprietari, data di creazione e nomi di file
-b mostra caratteri non stampabili con il loro codice ottale
-i mostra l’inode di partenza
-x mostra il risultato in riga e non in colonna


Cambio directory:

cd nomedirectory

cambia la directory puntando a nomedirectory. Se si vuole tornare alla dircetory che è radice dell’attuale digitare cd ..


Navigazione assistita:

pushd nomedirectory

mette un puntatore alla directory in uno stack

popd

si riposiziona alla directory in cima allo stack


Quanto spazio mi rimane sul disco?:

df

restituisce quanto spazio del disco è occupato e quanto è libero suddiviso per partizioni
Opzioni:
-a mostra anche le partizioni che hanno 0 blocchi
-H mostra i risultati in Kb o megabyte (means human readable, how fun!)
-T mostra il tipo di filesystem


Gestione dei diritti di accesso

Come funzionano?

Digitando:

ls -l

si vedono sull’estrema sinistra questi caratteri:

drwxrwxrwx

per ogni file, directory e link. Il primo carattere è ‘d’ per le directory e ‘l’ per i link. Seguono tre gruppi di caratteri.
Il primo gruppo indica i permessi garantiti al proprietario del file/directory/link. Il secondo gruppo è relativo al gruppo
cui il proprietario appartiene. Il terzo è relativo a tutti gli altri utenti. Il carattere r indica il permesso di
scrittura, il carattere w quello di scrittura ed infine x sta per esecuzione-modifica.


Chi può cambiare i permessi?

Il proprietario del file.


Si può cambiare la proprietà di un file?

Solo root dovrebbe poter cambiare il propietario di un file
Digitando:

chown user_nuovo_proprietario nomefile/nomedirectory

il proprietario del file o della directory viene cambiato. l’opzione -R forza l’istruzione a cambiare il proprietario
di tutti i file contenuti nella directory indicata.


Come cambio i permessi di accesso?

Digitando:

chmod opz u:g:a +:- r:w:x nomefile/nomedirectory

u usato per cambiare i permessi dell’owner, g per quelli del gruppo, a per tutti gli altri (non nel gruppo dell’uetente e diversi dall’utente).
Se si vogliono cambiare i permessi del gruppo e dell’utente bisogna usare il comando due volte.
L’opzione -R induce la variazione di accessi su tutti i file e sottodirectory di quella indicata. Una versione veloce del comando è questa:

chmod opz nnn nomefile/nomedirectory

Il comando in nnn usa valori decimali così gestiti: la prima cifra corrsiponde all’owner, la seconda al gruppo, la terza a tutti gli altri.
Le cifre sono calcolate usando le seguenti bitmap

100 lettura: valore 4

010 scrittura: valore 2

001 esecuzione: valore 1

Quindi 110 (lettura+scrittura) è 4+2=6, 111 (lettura+scrittura+esecuzione) è 4+2+1=7.

Per fare un esempio:

chmod -R 666 foodir

pone gli accessi di lettura scrittura a tutti per tutti i file e le sottodirectory della directory foodir
Mentre:

chmod -R 111 foodir

mette tutto in sola lettura

chmod -R 600 foodir

nasconde a tutti eccetto l’owner.


Come cambio la password?

passwd

e rispondere alle domande.


Gestione dei processi

Chi sta usando questa macchina?

who opz

ritorna la lista degli utenti he stanno usando il sistema. L’opzione -i mostra quando è avvenuto il logon dell’utente, -a informazioni
su tutti i terminali


Chi sono io (nel senso…che utente sto usando)?

whoami

Quali processi stanno girando in macchina?

ps -ely

ritorna la lista di tutti i processi attivi.

ps -elF

ritorna un albero dei processi

ps -aux

ritorna i processi e gli owner.

E’ interessante annotare il campo processid, con il quale si esegue il kill.


Ancora, quali processi stanno girando in macchina?

top

in linux è un ottimo sistema per tenere d’occhio facilmente quali programmi girano. Una volta lanciato
questo gestore di task rimane attivo in attesa di comandi. questa una lista di comandi:

q esce dal programma

> sposta la lista avanti

< sposta la lista indietro

h help

Z cambia i colori

B toglie i grossetti

u mostra solo i processi di un particolare user

f aggiunge o toglie una colonna nella vista (per Linux la scelta è guidata)

o cambia ordine delle colonne (per linux la scelta è guidata)

W salva la configurazione visuale

c mostra i comandi che stanno girando

i mostra le attività in idle
Nota: qualche terminale remoto potrebbe avere problemi di visualizzazione.
Si consiglia Putty .


Come lancio i processi in background?

Digitare

nomecomando &

per lanciare un programma in background.

bg numeroprocesso

per portare un comando in background (il numero processo lo da’ ps o top)


Come porto un processo in foreground?

Digitare

fg numeroprocesso

per portare un comando in foreground da background (il numero processo lo da’ ps o top)


Come comunico con i processi?

Digitare:

kill -HUP numeroprocesso

per riavviarlo. Il numeroprocesso lo da’ ps o top

kill -H numeroprocesso

per chiuderlo. Il numeroprocesso lo da’ ps o top


Cambiare la priorità di un processo

Le priorità del kernel GNU/Linux vanno da -20 a +20. La priporità più elevata è -20, solo il superuser può
settare priorità negative. La più basse è 20. 0 è la priorità di base. Digitare:

renice livello numeroprocesso

per cambiare le priorità. Il livello è un numerico da -20 a +20. Il numeroprocesso fornito da ps. Un formato alternativo è:

kill livello -p processo -g gruppo -u user

per indicare i processi di un gruppo di utenti o un utente.
Esempio:

vi &ps -e | grep vi

una volta letto il PID (=numeroprocesso) eseguire

renice +1 PID

Lanciare un processo ad una certa priorità

Digitare:

nice -n priorità comando opzionicomando [&]

per lanciare il comando nella priorità indicata in priorità .


Ricerca e gestione dei file

Cercare i file

Digitare:

find -name nomefile/nomedirecory

Cercare una stringa dentro ad un file

Digitare:

grep stringa nomefile

Concatenare più file

Digitare:

cat nomefile1 nomefile2 nomefile3 .... nomedistinazione

Visualizzare la coda di un file

Digitare:

tail -n numerorighe nomefile

per vedere le ultime numerorighe del file. Se si usa:

tail nomefile

si vedono le ultime 10 righe


Visualizzare la testa di un file

Digitare:

head -n numerorighe nomefile

per vedere le prima numerorighe del file. Se si usa:

head nomefile

si vedono le ultime 10 righe


Visualizzare un file

Digitare:

less nomefile

oppure:

more nomefile

si vedono le ultime 10 righe


Differenze tra file

Digitare:

diff nomefile1 nomefile2 > filedidifferenze

per avere un file che mostra le differenze tra file. Questo file di differenze si può anche
utilizzare per allineare due file:

patch nomefiledestinazione filedidifferenze

il file nomefiledestinazione viene aggiornato con le differenze.
Per una trattazione più esaustiva ‘read the fine manual’


Contare le righe di un file

Digitare:

wc nomefile1

Come cambio dei caratteri di un file con altri?

Per la variazione massiva di caratteri di un file

tr stacaratteridavariare listacaratteridainserire

per esempio. tr usa come input lo standard input e come output lo standard
output. Quindi per esempio

less prova.txt | tr '.' [:space:] > provaout.txt

Per cancellare un carattere:

less prova.txt | tr -d '.' [:space:] > provaout.txt

Una guida esaustiva e in italiano sulle Unix Scripr la si trova nel famoso (per chi sa cos’è una BBS) www.pluto.it. Non leggetela se siete Lamers (ovvero persone che scrivono sui Blog come esperti quando ancora devono imparare qualcosina, è il contrario di Hackers), siamo di fronte a guida con un manutentore, sicura e vecchio stile, niente blog e niente wiki!

Alla rpossima puntata!

Posted in unix script | 18 Comments »