Modulo 5: Utilizzo in maniera approfondita della shell e dei comandi di Linux (Parte seconda); configurazione dei file system
La shell Bash; variabili di ambiente, personalizzazione, comandi, history ecc.
Cat /proc/version (per identificare la distribuzione di Linux corrente)
Uname –a (informazioni complete su macchina e kernel)
-
La variabile di ambiente SHELL contiene la shell corrente (echo $SHELL).
-
Per settare una variabile di ambiente in BASH, VAR=valore; senza il comando export il valore rimane visibile solo all’interno della shell corrente (echo $VAR).
-
Se digitiamo VAR=valore; export VAR e lanciamo una nuova /bin/bash ci accorgiamo che con echo $VAR il valore persiste anche nelle shell figlie di quella dove abbiamo settato inizialmente la variabile.
-
Introduzione alla shell; le variabili di ambiente (.bash_profile, PS1=”\h:\w>”, il comando export).
-
Ad esempio posso usare nella variabile d’ambiente PS1 = $USER \h \w per stampare nel prompt lo username, il nome host e la directory corrente.
-
~ è il simbolo della home directory di un utente: cd ~david equivale a cd /home/david.
-
File di inizializzazione shell utente /home/david/.profile, /home/david/.bash_profile, /home/david/.bash_login, le inizializzazioni per tutti gli utenti si trovano in /etc/profile.
-
In /home/david/.bashrc in genere si trovano le definizioni degli alias per i comandi: alias rm ‘rm –i’, alias mv ‘mv –i’ , per evitare esiti catastrofici di comandi rm dati con leggerezza.
-
/home/david/.bash_history contiene la history dei comandi controllata dalla variabile di ambiente HISTSIZE=1000 per il numero dei comandi da inserire nella history.
-
/home/david/.bash_logout contiene i comandi da eseguire al momento del logout (ad esempio clear per cancellare i comandi rimasti a video).
-
I comandi shell vengono separati dal ; mentre quelli che continuano su più righe sono separati da un ‘\’.
-
I comandi racchiusi tra ` (ALT-96 o apice retroverso) vengono prima risolti dalla shell e poi passati come argomento al comando: es. ls `pwd` mostra i file nella dir corrente in quanto prima viene eseguito il comando pwd, e l’output viene poi passato al comando ls.
Lo script .bashrc viene eseguito quando parte una sottoshell all'interno di una shell (es. comando “su utente”); al momento del login viene eseguito .bash_profile.
Se esiste .bash_profile non viene cercato .profile e viene eseguito .bash_profile (questo vale per la shell BASH).
mkdir -p /home/david/documenti/linux (crea tutta la struttura delle dir)
Esercizio: personalizzare il prompt della shell e aggiungere “/usr/games/fortune” al momento del login di ogni utente.
Comandi shell avanzati (sed, awk, filtri, pipe, sort, tee, 2>&1, ecc.)
-
Esistono 3 stream di default (stdin, stdout, stderr; ogni programma linux in esecuzione in condizioni normali ha a disposizione questi 3 flussi).
-
redirezione input: esempio (dato un file lista): sort listaordinata
-
sort +1 (ordina sul secondo campo)
-
append (sort >archivio)
-
redirezione stderr (esempio sort >& fileoutput); in questo modo si redirige sia lo stdout che stderr in fileoutput.
-
per redirigere solo stderr (sort fileinesistente 2> fileoutput); difatti lo stdout in questo modo va al canale di default, ovvero il video.
-
La pipe serve per connettere l’output di un comando con l’input di un altro per formare comandi complessi tramite l’utilizzo in cascata di comandi elementari (sort +1 lista | nl, per ottenere una lista ordinata e numerata).
-
Cat /etc/passwd | wc –l (conta le righe di /etc/passwd).
-
Pipes e redirezioni possono essere combinati insieme: who | wc –l > utenti.log.
-
Il comando tee copia lo stdin in stdout ed in più scrive dentro un file dato come argomento (utile per mandare dati in pipe e salvarne anche una copia) (es. who | tee utenti | wc –l, conta gli utenti ed in più scrive la lista degli utenti nel file utenti).
-
2>&1 (redirige lo stderr nello stesso canale dell’stdout, es: wc –l fileinesistente >conteggio 2>&1; in questo modo l’errore finisce nel file di output insieme all’output).
-
es. wc lista 2>&1 | tee conteggio | nl (l’output del comando wc finisce in conteggio insieme all’eventuale stderr e poi viene trasmesso in pipe come input per il comando nl: (quindi se wc fileinesistente 2>&1 | tee conteggio | nl, in conteggio trovo l’errore generato da wc che poi viene mandato in input (l’errore) al comando nl.
-
find . –name README –print | xargs more (fornisce in input al comando more un risultato alla volta proveniente dalla find, ovvero permette di leggere un solo file alla volta).
-
Esercizio: Trovare tutti i file in una directory che siano più nuovi di un certo file e copiarli in un’altra directory (confrontare la soluzione Windows tramite explorer e quella Linux da riga di comando):
find /tmp/source/ -name ‘*.mp3’ –newer lista.txt –exec cp {}/tmp/dest \;
-
Esercizio: comando per stampare solo il numero dei processi in esecuzione dal più grande al più piccolo:
(Soluzione 1)
ps -ax | awk '{ print $1 }' | grep -v PID | sort –nr
(Soluzione 2)
ps -ax | cut –c 1-5 | grep -v PID | sort –nr
Il comando sed (stream editor) può essere utilizzato per fare operazioni globali su di un file (sostituzioni, cancellazioni selettive ecc.)
cat lista | sed ‘s/David/Davide/’
(AWK: linguaggio per la manipolazione di pattern, predecessore del PERL insieme a SED (editor di flusso)).
-
tr ‘A-Z’ ‘a-z’ -
head, tail (tail –f /var/log/messages, per osservare in tempo reale le modifiche al log di sistema).
-
cat lista, tac lista.
-
grep “^D” lista (tutte le righe che iniziano con D maiuscola)
-
grep “e$” lista (tutte le righe che terminano in e)
-
Esempi di pattern per grep (pagina 189)
-
1,$s/find/replace/g (comando di sostituzione globale in VI)
-
Copia di blocchi in VI: marcare inizio blocco (ma), fine blocco (y’a), copia (p).
-
Cancellazione di 3 righe (3dd), copia di 3 righe (3yy), trova (/), (n) occorrenza successiva.
-
(u): undo, (.) ripete l’ultimo comando eseguito.
-
Per copiare blocchi tra due file in VI: vi primo secondo; nel primo marcare un blocco con (ma, y’a), spostarsi nel secondo con (ESC:n oppure con ESC:e#) ed incollare con p; posso avere più blocchi memorizzati utilizzando mb, y’b ecc.
Esercizio:
Visualizzare la lista dei servizi dal file /etc/services, togliendo le righe che iniziano con il cancelletto e mettendo in ordine alfabetico i servizi e stampando solo servizio e porta separati da un tab.
cat /etc/services | grep -v "\#" | awk '{ print $1 "\t" $2 }' | sort | more
Versione 2 (visualizza solo servizio porta in ordine ascendente ed eliminando ogni altra informazione ed espandendo il tab a 20 caratteri per ragioni di formattazione; con intestazione)
echo –e “Servizio\tPorta”
cat /etc/services | awk '{ if ($1 != "") print $1 "\t" $2 }' | grep -v "^#" | sort +1 -ng | expand -t 20 | sed 's/\/...//'
Esercizio (filesystem, fstab, fsck): creazione di una nuova partizione
Per creare un nuovo filesystem associato ad una nuova partizione su disco già pieno:
1. Partire in single user mode
2. umount /dev/hda7 (file system di / che deve essere ridimensionato)
3. e2fsck /dev/hda7 (prima della resize)
4. parted /dev/hda (utilizzare resize con numero di minor - print ed effettuare il resize della partizione)
5. reboot macchina
6. sempre in single user mode usare fdisk e creare una nuova partizione logica (/dev/hda9 - n - l -w) utilizzando lo spazio liberato
7. reboot macchina
8. mke2fs /dev/hda9 (crea un nuovo filesystem ext2 sulla partizione logica nuova)
9. e2fsck /dev/hda9 oppure fsck.ext2 /dev/hda9
10. vi /etc/fstab e aggiungere
/dev/hda9 /nuovo ext2 defaults 1 2
11. creare il mount point /nuovo
12. provare con mount /nuovo e df -k o df -h
13. controllare /etc/mtab
14. fare il reboot e controllare che il nuovo filesystem sia stato montato
-
Quota, filesystem (fstab, mtab)
-
Link simbolici ed hard links (accennare agli inode, il comando ln per creare link, ln –s crea un link simbolico).
Share with your friends: |