Testo | File | Strumenti impiegati | Data di svolgimento |
Verificare se
c'è un UID libero tra il più alto presente nel file /etc/passwd e quello immediatamente inferiore. | uid1.sh | Variabili, backtick, pipelines, filtri (sort, head, tail), aritmetica della shell, test, if-then-else | 30 gennaio |
uid2.sh | read, apertura di subshell | 30 gennaio |
Stampare gli username corrispondenti ai 5 più elevati userid presenti nel file /etc/passwd. | 5nomi1.sh | cut avanzato, read di più variabili, cicli while | 30 gennaio |
5nomi2.sh | awk | 30 gennaio |
Cercare
lo username con uid più elevato, chiedendo all'utente conferma per
proseguire ogni volta che nella ricerca si incontra un uid via via più
elevato. | max.sh | read alimentato esplicitamente da terminale | 30 gennaio |
Contare
quanti file
esistono con una certa estensione,
definita come la stringa posta dopo l'ultimo carattere "punto" presente
nel nome del file, per tutte le estensioni trovate nei file presenti
nel direttorio passato come parametro sulla riga di comando e
sottodirettori. Limitare l'output alle sole 5 estensioni più
numerose. | estensioni.sh | rev, grep, uniq, variabili speciali $n | 30 gennaio |
Esercizio proposto: Modificare
l'esercizio precedente per contare quanti file
esistono con una certa estensione, limitatamente all'elenco di
estensioni passate
come parametri sulla riga di comando. | estparam.sh | | 30 gennaio |
Progettare
uno script che lanci due comandi in parallelo (in questo esempio i
comandi siano "sleep 10" e "sleep 20") e verifichi ogni 5 secondi se
sono ancora in esecuzione o no, scrivendo sul file "log" lo stato dei
due processi e terminando l'esecuzione quando entrambi terminano. | parallelo.sh | esecuzione in background, variabile speciale $!, sleep, ps, break | 1 febbraio |
Esercizio proposto: Modificare
l'esercizio precedente perchè accetti come parametri un numero
arbitrario di comandi da lanciare in parallelo, poi proceda alla
verifica periodica come sopra. | parallenne.sh | array della shell, shift e/o variabili speciali $* $@ | 1 febbraio |
Produrre su standard
output l'elenco delle 10 directory di N-esimo livello (N passato come secondo parametro) che occupano
più spazio al di sotto della directory passata come primo parametro, ordinato dalla più grande
alla più
piccola. | dirsizeN.sh | controllo dei parametri, du, egrep | 1 febbraio |
Esercizio proposto: Modificare
l'esercizio precedente perchè, invece di selezionare le directory al
livello specificato, individui automaticamente le directory foglia,
cioè quelle che non contengono altre directory | leafsize.sh | | 1 febbraio |
Creazione di utenti, gruppi, directory condivise | traccia dei comandi | ripasso su permessi, bit speciali, umask | 6 febbraio |
Copiare in una
directory (passata come primo parametro allo script) tutti i file contenuti nella directory passata come secondo parametro
più vecchi di un certo numero di giorni (passato come terzo
parametro). | archiveflat.sh | find | 8 febbraio |
Esercizio proposto: trovare tutti i file con almeno un bit speciale settato, metterli in un file elenco.nuovo, ed al termine confrontare i file elenco.nuovo ed elenco.vecchio mostrando le differenze. Aggiornare poi elenco.vecchio con il contenuto di elenco.nuovo. | findspecial.sh | find, sort o grep che utilizza pattern presi da un file | 8 febbraio |
Copiare mantenendo la struttura delle directory
originali in cui si trovano, tutti i file del sistema più vecchi di
un certo numero di giorni (passato come
secondo parametro allo script) e tutti i file appartenenti ad uid non
corrispondenti ad utenti validi del sistema in una directory (passata
come primo parametro). | archivetree.sh | tar | 8 febbraio |
Dato un file di nome "testo" sulla macchina
virtuale locale, composto da 1 parola per ogni riga, lo si faccia
remotamente ordinare alla macchina che ha meno processi in esecuzione
tra quelle elencate nel file "lista", memorizzando il risultato nel
file "testo.ord" in locale. | sshnum.sh sshload.sh sshsort.sh | esecuzione remota e spostamento dati con ssh | 13 febbraio |
Esercizio proposto: descrivere la configurazione di un account utente sshknock sulla macchina virtuale 2 (MV2), in modo che sia possibile raggiungerlo via ssh dall'utente root della MV1, ma non
avviare una sessione interattiva. L'unico effetto della connessione
deve essere la scrittura dell'indirizzo del client che la origina
nel file /home/sshknock/ip.new | sshknock.txt | file authorized_keys | 13 febbraio |
Questo
script accetta tre parametri: il primo è una directory locale, il
secondo un nome di host, il terzo una directory su tale host. Lo script deve trasferire, mantenendo struttura e permessi, il contenuto della dir. locale sull'host remoto nella dir. indicata. Ricordare
di controllare la validità formale dei parametri ed anche se possibile
la validità effettiva: in questo caso si può testare l'esistenza della
dir, la raggiungibilità dell'host, e se la dir remota non esiste
crearla.
| sshcopy.sh | ssh, tar, ping/nc, esecuzione condizionata con "&&" | 15 febbraio |
Campionare
ogni 10 secondi il carico del sistema e scrivere l'output sul file
/var/log/load. Configurare il sistema per accertarsi che lo script sia
sempre in esecuzione.
Ogni
giorno alle 23:59 ruotare il log /var/log/load tenendo le ultime N
copie in file compressi con nome /var/log/load.x.gz (x=1 per la
copia più recente, x=2 per la penultima, ecc...).
Curare
l'atomicità delle operazioni in modo da non perdere dati, ed
effettuare le verifiche opportune per evitare che
l'accesso concorrente possa danneggiare i file. | Prima variante: scrittura continua
logload1.sh logrotate1.sh
| fuser, spostamento di file aperti, gzip | 15/22 febbraio |
Seconda variante: riapertura del file ogni 10s
logload2.sh logrotate2.sh |
crontab.txt /etc/inittab | cron, init |
Esercizio proposto:
realizzare una procedura di backup incrementale rispetto al precedente
esercizio "sshcopy.sh", cioè un analogo sistema di copia remota che
però trasferisca solo i file cambiati o apparsi dopo l'ultima
esecuzione del backup. Risolvere il problema in due modi: 1) con tar (si vedano le opzioni mtime, newer e simili) 2) con rsync (si studi la man page) | incr-tar.sh incr-rsync.sh | tar, rsync, ssh
confronto di timestamp | 15 febbraio |
configurazione di una rete client-router-server, analisi e diagnostica del traffico | rete | ifconfig, route, ping, wireshark | 15 febbraio |
Se il carico del
sistema è inferiore ad una soglia specificata come primo
parametro dello script, lancia il comando specificato come secondo
parametro. Altrimenti, con at,
rischedula il test dopo 2 minuti, e procede così finchè
non riesce a lanciare il comando.
Estensioni proposte: - verificare i problemi di path e di output dovuti all'esecuzione dello script da parte del demone atd. - estendere lo script perchè qualsiasi parametro specificato dopo il secondo venga passato al comando da eseguire. | niceexec.sh | at | 22 febbraio |
Predisporre
uno script che aggiorni in tempo reale le statistiche tratte da un file
di log (anche molto grande), ad esempio permettendo di contare quante
righe sono comparse tra un'osservazione e la successiva. | logwatch.sh | funzioni, signal handling, tail -f, peculiarità delle subshell | 22 febbraio |
Monitorare il traffico ssh tra il client virtual1 ed il server virtual3 sul router virtual2: 1) loggando attraverso syslog sul file /var/log/newconn l'inizio e la fine di ogni connessione diretta da v1 a v3 2)
durante la "vita" di ogni connessione, al superamento di una certa
soglia (espressa in numero di pacchetti per minuto) connettersi
alla sorgente del traffico eccessivo ed individuare l'utente
responsabile e loggare lo username nel file /var/log/excess | netmon.sh syslog.conf | iptables syslog netstat
xargs case | 27 febbraio |
Predisporre virtual3 per poter rispondere ad una query snmp che rilevi se il carico di tale host è superiore a 0.5. Effettuare la query da virtual1, verificando con wireshark su virtual2 (router) il contenuto dei pacchetti. | snmpd.conf.txt snmpload.sh | /etc/snmp/snmpd.conf
snmpget | 5 marzo |
Esercitazione completa su routing, filtraggio, ssh, monitoraggio.
Dopo aver configurato come specificato sopra una rete client/router/server realizzare il seguente sistema di comunicazione.
Il primo script, toctoc.sh, gira sulle macchine client (della rete 10.1.1.0/24) ed accetta come parametri due indirizzi IP (router e server) ed un numero di porta TCP (port).
Usando ssh, deve depositare nella directory /tmp/ di router un file che abbia come nome l'IP address di client, che contenga in una singola riga i valori server e port separati da uno spazio, mantenendo poi la connessione ssh per almeno un minuto.
Esempio, sulla macchina 10.1.1.1 lancio
toctoc.sh 10.1.1.254 10.9.9.1 80
-> viene creato sulla macchina 10.1.1.254 un file di nome /tmp/10.1.1.1 che contiene "10.9.9.1 80"
Il secondo script routerconf.sh
serve a configurare inizialmente il router, che deve agire
da firewall, bloccando di default tutto il traffico tranne quello indispensabile per il funzionamento di toctoc.sh.
Il terzo script serverconf.sh serve a configurare il firewall dei server per accettare traffico entrante solo dagli host della rete locale.
Il quarto script avanti.sh è pensato per girare su router, e deve verificare senza mai fermarsi, ogni 5 secondi, se sono presenti connessioni ssh a router a cui corrispondano in /tmp file inviati da client "toctoc". Nel caso ne trovi deve:
1) inserire le regole nel packet filter che consentano al client di attraversare il router solo per connettersi al server sulla porta remota
specificata nel file. Porre attenzione alla direzione delle
connessioni. Vista la limitazione di traffico sui server, mascherare i
pacchetti che dai client attraversano router. 2) cancellare il file creato dal client e disconnettere forzatamente la connessione ssh agendo sul server sshd
Il quinto script timeout.sh,
in esecuzione sul router anch'esso, deve osservare il transito
dei pacchetti relativo alle connessioni abilitate da avanti.sh.
Trascorsi 5 minuti circa (per comodità nel calcolo si possono
trascurare i secondi) di assenza di traffico relativo ad una
connessione, deve rimuovere dal packet filter la regola che la
consente, inserita in precedenza da avanti.sh. | NOTA: non tutte le soluzioni sono complete, alcune come specificato nei commenti sono solo tracce.
toctoc.sh routerconf.sh serverconf.sh avanti.sh timeout.sh | ssh
iptables
logging
inittab
kill
netstat
cron | 5/7 marzo |
Esercitazione su configurazione di server LDAP ed utilizzo dei client tools a riga di comando
(è consigliabile aver letto la guida a ldap)
filesystem.schema - Definire un attributo fn di
tipo adatto a rappresentare un nome di file, un attributo fs adatto a
rappresentare una dimensione in byte, una classe ausiliaria dir che
contenga obbligatoriamente fn e facoltativamente fs, una classe
ausiliaria file che contenga obbligatoriamente sia fn che fs
ldap-fs-store.sh
- memorizzare nella directory un sottoalbero del filesystem, passato
come parametro allo script, riproducendo con i DN la struttura
gerarchica della collocazione di file e directory
ldap-fs-sumspace.sh
- esplorando la directory LDAP, calcolare per ogni entry che
rappresenta una directory lo spazio occupato dai file presenti in
tale directory, ed aggiornare l'entry con la somma
es: in LDAP ho
fn=pippo,fn=lib,fn=usr.... con fs=10
fn=pluto,fn=lib,fn=usr.... con fs=20
--> aggiorno l'entry fn=lib,fn=usr....
impostando fs=30
ldap-fs-purge.sh
- esplorare la directory LDAP, e verificare se i file in essa
rappresentati esistono ancora sul filesystem. In caso contrario
rimuoverli da LDAP. | filesystem.schema
ldap-fs-store.sh
(ldap-fs-insert.sh)
ldap-fs-sumspace.sh
ldap-fs-purge.sh
| /etc/ldap/slapd.conf /etc/ldap/schema/*
ldapadd, ldapsearch, ldapmodify | 7/12 marzo |