Unix: come sopravvivere ● username, password, login,... ● le shell ● le man pages ● i comandi ● i processi ● I/O: stdin, stdout, stderr ● pipes (?)
login ● Ogni utente è (univocamente) individuato da uno username (>= 8 caratteri significativi) cui è associata una password che deve essere, per quanto possibile, non banale o stupida o facilmente intuibile (fidanzati/e, figli/e, date, animali, etc.: problema oramai scottante... =>) ● Internamente: username (uid, gid) ● uid = user id (1 < uid < 65535) ● gid = group id (1 < gid < 65535)
decreto 'antiterrorismo' ●... impedire l'uso di terminali che non consentano l'identificazione dell'utente;... impedire l'accesso ad utenti che non siano preventivamente identificati... ● dati identificativi: ● nome, cognome, luogo e data di nascita ● estremi documento d'identita' ● documento d'identita' digitalizzato ● data di attivazione
utenti e gruppi ● /etc/passwd => database utenti ● formato => uname:pass:uid:gid:info:home:shell ● password crittate cone algoritmo one-way ● file di testo, leggibile a tutti!!! ● /etc/shadow => database utenti sicuro ● file di testo, ma è chiuso al mondo ● algoritmi di crittazione evoluti ● /etc/group => database gruppi (grname, gid)
/etc/passwd ● uname: la vostra username ● passw: la password crittata ● uid: user id ● gid: group id ● info: in genere nome e cognome ● home: la vostra home directory ● shell: la vostra shell preferita
quando vi collegate: ● il programma 'login' vi chiede prima la username e poi la password; ● se la prima esiste la password viene crittata e quindi confrontata con quella immagazzinata nel file /etc/passwd ● se la password è corretta il sistema fa partire la vostra shell a vostro nome e usa come directory iniziale quella immagazzinata in /etc/passwd
le shell (1) ● interfaccia primaria tra utente e sistema operativo/risorse H/W della macchina ● possono essere usate interattivamente o in batch ● due famiglie fondamentali: ● Bourne shell: sh, ksh, bash, zsh ● C shell: csh, tcsh ● si differenziano per sintassi e possibilità di editing dei comandi (tab completion etc. etc.)
le shell (2) ● quelle consigliate: bash, zsh e tcsh – completamento dei nomi, editing della linea di comando, history, scripting evoluto, etc. etc. ● esempio: completamento dei nomi. Basta digitare le lettere sufficienti ad indentificare univocamente un comando e poi usare [TAB]: la shell si farà carico di completare correttamente il comando – è la feature preferita dai sistemisti pigri e permette di digitare a velocità warp.
sono connesso. ed ora? ● 'pwd': stampa la directory nella quale vi trovate. ● 'ls': elenca i file presenti nella directory corrente, o in quella che gli passate come argomento: ● ls ● ls -l ● ls -la./work ● devo cambiare password: come faccio? ● man -k password; apropos password
le man pages ● la principale (ed a volte unica) fonte di informazione su unix; nelle man pages (quando esistono) c'è sempre (o quasi) tutto quello che vi serve sapere su un comando, o una funzione, o una libreria per la programmazione. ● sintassi: ● man -k : man -k password, man -k copy,... ● man : man ls, man cc, man passwd,...
man pages sections ● 1 – comandi ● 2 – system calls ● 3 – functions ● 4 – devices ● 5 – file di configurazione ● 7 – moduli ● 8 – linux programmer's manual ●...
i comandi ● formato standard: ● cmd [-opzioni] argomento argomento ● in genere esiste un'opzione '-h' (o '--help') per accedere ad una presentazione sintetica (il più delle volte incomprensibile) del comando. ● le opzioni 'corte' possono essere accorpate in ordine casuale: ● ls -l -a -s == ls -las == ls -sla
file e directory ● 'ls' => lista ● 'pwd' => stampa la dir corrente ● 'cd ' => cambia la dir di lavoro ● 'rm ' => cancella un file ● 'cp ' => copia un file ● 'mv ' => rinomina un file ● 'rmdir ' => cancella una dir (solo se vuota)
wildcard - il sottile fascino di unix... ● rm -f *.o *.bak test?.c => rimuove tutti i file con estensione.o e.bak, e tutti i file del tipo test1.c, test2.c,..., testg.c, etc. etc., ignorando in silenzio eventuali errori (tipicamente: non esiste alcun file con estensione.c). ● rm -f *.o *.bak test?.c => apparentemente come prima, tranne che per lo spazio tra il secondo asterisco e '.bak'. Cosa succede in questo caso?
file e directory ● 'chown' => cambia il proprietario di un file ● 'chmod' => cambia i permessi di un file ● rwx – Read, Write, eXecute permission ● ugo – User (= owner), Group, Other ● chmod u+rwx == owner può fare tutto ● chmod go-rwx == gruppo ed altri senza alcun permesso ● chmod ugo=rwx == file aperto a tutti ● 'chgrp' => cambia il gruppo cui appartiene un file
altri comandi ● 'cat ' => stampa il contenuto di un file ● 'more ' => come prima, ma una pagina per volta con funzionalità evolute (scrolling, ricerca di stringhe, etc. etc.) ● 'less ' => less è un'evoluzione di more... ● 'sort ' => ordina le linee di testo (con campi/chiavi letterali/numeriche a scelta) ● 'wc ' => conta (linee, parole, caratteri) di un file
ancora comandi... ● 'vi' => l'editor più difficile del mondo, ma l'unico che troverete dovunque e funzionerà sempre. ● 'ed' => l'editor più scomodo del mondo, ma... ● 'sed' => editor sequenziale: ● sed -i.bck 's/data/for/' *.txt ● 'grep' => manipolatore di regular expression ● 'awk' => che e'? indefinibile, ma serve...
awk: Aho, Kernighan, Weinberger ● If you are like many computer users, you would frequently like to make changes in various text files wherever certain patterns appear, or extract data from parts of certain lines while discarding the rest. To write a program to do this in a language such as C or Pascal is a time-consuming inconvenience that may take many lines of code. The job is easy with awk, especially the GNU implementation: gawk. ● The awk utility interprets a special-purpose programming language that makes it possible to handle simple data- reformatting jobs with just a few lines of code.
... solo awk:
... awk + sort:
... awk + sort + uniq:
I/O (1) ● OGNI processo unix nasce con tre file descriptor aperti automaticamente: ● stdin => standard input ● stdout => standard output ● stderr = standard error ● in genere: ● stdin = tastiera ● stdout = stderr = schermo
I/O (2) ● Il sistema è in grado di associare uno qualsiasi di questi FD (o tutti) a file veri e propri tramite gli operatori di redirezione, >>: ● ls -l >lista_files ● salca <input_data ● salca >result >result <input.2 ● mcgen 2>errors <input_data ● RNDgen random_out; MC data
I/O (3) ● L'ultimo caso citato, quello in cui l'uscita di un programma deve essere passata in ingresso ad un altro programma per un'ulteriore elaborazione, è particolarmente frequente. Così tanto che unix mette a disposizione le pipe, '|': ● RNDgen data ● Lo stdout di un programma viene automaticamente reindirizzato sullo stdin di un altro programma; la sincronizzazione tra i due è assicurata dal SO.
/arp who-has/ => REGEXP ● Regular expression (regexp): modello per effettuare una ricerca testuale (pattern matching) ● Fondamentali quando non dovete cercare parole ma intere classi di espressioni (pensate alle wildcard). ● Quasi un 'linguaggio' (per la scrittura di pattern): ● '.' = qualsiasi carattere, '\w' = alfanumerici (a-z, 0-9) piu' '_', '\d' = cifra, '\s' = spazio,... ● quantificatori: '?' = zero o uno, '+' = uno o piu', '*' = zero o piu', '{n,m}' = tra n ed m occorrenze,...
regexp example (with grep)
i processi (1) ● ogni comando può essere eseguito in background (senza che la shell rimanga in attesa della sua fine per ridarvi il controllo) terminando la linea con &: ● cp work/* /mnt/floppy & ● 'jobs' => lista dei processi in background ● 'fg' => riporta in foreground (interattivo) un processo lanciato con &; [CTRL+Z] bg sospende e manda in background un processo interattivo.
i processi (2) ● 'ps [milioni di flag]' => report process status ● 'ps' => tutti e soli i processi figli della shell corrente ● 'ps aux' => tutti i processi che girano ● 'kill -signal ' => invia il segnale specificato (segnale = modalità di comunicazione tra processi) al processo identificato da (ogni processo è univocamente individuato da un process identifier) ● 'kill ' => uccide (nel senso stretto del termine: 9 = SIGKILL) il processo 3526
i processi (3) ● 'pstree' => un'evoluzione di ps in grado di mostrare tutti i processi e le loro relazioni di parentela (in unix ogni processo tranne init è figlio di qualche altro processo). ● 'pstree -pu' => mostra l'albero con user e pid. ● 'top' => ulteriore evoluzione di ps in grado di mostrare i processi attivi con aggiornamenti periodici