Unix: come sopravvivere

Transcript

Unix: come sopravvivere
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 <stringa>: man -k password, man -k copy, ...
●
man <comando>: 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 <new_dir>' => cambia la dir di lavoro
●
'rm <file>' => cancella un file
●
'cp <file1> <file2>' => copia un file
●
●
'mv <old_name> <new_name>' => rinomina un
file
'rmdir <dir>' => 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 <file>' => stampa il contenuto di un file
'more <file>' => come prima, ma una pagina per volta
con funzionalità evolute (scrolling, ricerca di
stringhe, etc. etc.)
'less <file>' => less è un'evoluzione di more...
'sort <file>' => ordina le linee di testo (con
campi/chiavi letterali/numeriche a scelta)
'wc <file>' => 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 datareformatting 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 <input.1; salca >>result <input.2
●
mcgen 2>errors <input_data
●
RNDgen <seed_list >random_out; MC <random_out
>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 <seed_list | MC >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 <pid>' => invia il segnale specificato
(segnale = modalità di comunicazione tra
processi) al processo identificato da <pid> (ogni
processo è univocamente individuato da un
process identifier)
●
'kill -9 3526' => 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