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 |
8 marzo
|
uid2.sh |
read, apertura di subshell |
8 marzo
|
Stampare
gli username corrispondenti agli N più elevati
userid presenti nel file
/etc/passwd, essendo N un parametro passato sulla
riga di comando. |
5nomi1.sh |
cut avanzato, read di più variabili, cicli
while |
10 marzo
|
Mostrare tutti gli username, chiedendo
all'utente conferma di un'ipotetica azione da svolgere per ciascuno. |
readterminal.sh |
read alimentato esplicitamente da terminale |
10 marzo
|
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 |
2 marzo
|
Esercizio
proposto: Modificare
l'esercizio precedente per eliminare dal conteggio le directory ed
evitare che "punti" in campi diversi dal nome file possano causare
problemi. |
estensioni2.sh |
|
|
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 |
|
|
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 |
15 marzo
|
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
parallenne-alt.sh
(array con indici non consecutivi, controlli più specifici sui processi
in esecuzione)
|
array della shell, shift e/o variabili
speciali $* $@ |
17 marzo
|
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
dirsizeN-opts.sh
(versione con getopts per passare più agevolmente i tre parametri -d dir -l livello -n num.dir.da.mostrare)
|
controllo dei parametri, du, egrep |
15/17 marzo |
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 |
|
|
Creazione di utenti, gruppi, e directory
condivise in cui utenti di un gruppo possano collaborare (creando file
che siano automaticamente accessibili in lettura e scrittura da tutti i
membri del gruppo): |
traccia
dei comandi |
ripasso su permessi, bit speciali, umask;
adduser, chown, chmod |
22 marzo
|
Configurazione di un filesystem su
dispositivo affidabile:
partizionamento dei dischi, definizione di un RAID software,
formattazione, configurazione per il restart automatico. |
traccia
dei comandi [PDF]
|
fdisk, mdadm, lvm commands, mkfs.ext3,
/etc/fstab, /etc/mdadm
|
24 marzo
|
Copiare in una
directory (passata come secondo parametro allo script) tutti i file
contenuti nella directory passata come primo parametro
che non siano stati modificati da più di un dato numero di
giorni (passato come terzo
parametro). |
archiveflat.sh |
funzioni, controllo formale dei parametri,
find |
29 marzo
|
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 secondo questo formato:
Nuovi
file trovati rispetto alla precedente invocazione:
...
elenco dei file che compaiono in elenco.nuovo ma non in elenco.vecchio
...
File
cancellati rispetto
alla precedente invocazione:
...
File a cui è stato rimosso il bit speciale dalla precedente invocazione:
...
Aggiornare poi elenco.vecchio con
il contenuto di elenco.nuovo. |
findspecial.sh |
find, sort o grep che utilizza pattern
presi da un file |
|
Copiare in una directory (passata come
primo parametro allo script):
- tutti i file del sistema che non siano
stati modificati da un dato numero di giorni (passato come secondo
parametro allo script)
- tutti i file al di sotto di /home
appartenenti ad uid non corrispondenti ad utenti validi del sistema
mantenendo la struttura delle directory originali in cui si trovano. |
archivetree.sh |
tar |
29 marzo
|
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 |
31 marzo
|
Esercizio
proposto: descrivere la configurazione di un account
utente sshknock
sulla VM Server, in modo che sia possibile raggiungerlo
via ssh dall'utente root
della VM Client, 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 |
|
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 "&&" |
31 marzo
|
configurazione di una rete
client-router-server, analisi e diagnostica del traffico |
rete |
ifconfig, route, ping, wireshark, netstat,
xargs |
12 aprile
|
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 |
14 aprile
|
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 |
|
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.
- estendere
lo script perchè accetti un nuovo parametro, prima di tutti gli altri,
che rappresenta il numero massimo di tentativi da eseguire.
Superato tale numero il processo non viene rischedulato, e il
fallimento viene loggato con priorità error; loggare con priorità info ogni
tentativo.
|
niceexec.sh |
at |
19 aprile
|
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 |
19 aprile
|
Monitorare il traffico ssh tra la VM Client e la
VM Server sulla VM Router:
- loggando attraverso syslog sul file /var/log/newconn
l'inizio e la
fine di ogni connessione diretta da Client a Server
- 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;
- provvedere
alla realizzazione di uno script di controllo che avvii ed arresti il
monitoraggio, eseguendo tutte le operazioni di configurazione in modo
automatico.
|
netmon
monitor.sh
startstop.sh
track.sh |
iptables
syslog
netstat
xargs
case |
26/28 aprile
|
Introdurre un nuovo
server nel sistema delle VM e configurare filtraggio, mascheratura e
ridirezione del traffico sul router
|
traccia e suggerimenti in PDF
|
|
3 maggio
|
Predisporre il demone snmpd su Server per poter
realizzare via snmp
i controlli previsti dagli esercizi "sshnum" (rilevando il carico del
sistema anzichè il numero di processi attivi) e "netmon" (elencando le
connessioni attive sulla macchina)
Verificare con wireshark il contenuto dei pacchetti. |
snmpd.conf.txt
|
/etc/snmp/snmpd.conf
/etc/default/snmpd
snmpwalk, snmpget |
10 maggio
|
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
ESERCIZI PROPOSTI:
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-sumspace.sh
ldap-fs-purge.sh
|
/etc/ldap/slapd.conf
/etc/ldap/schema/*
ldapadd, ldapsearch, ldapmodify |
17 maggio |
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 attivata da toctoc.sh agendo sul server sshd
Estensione proposta: condizionare l'esecuzione del punto 1 alla verifica, da condurre via SNMP, che sul server sia in esecuzione il processo rsyslogd
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.
Lo
script openclose.sh può essere usato per concentrare le
operazioni di apertura e chiusura del firewall in modo da garantirne la
coerenza tra avanti.sh e timeout.sh.
Estensione proposta:
all'atto della chiusura della connessione, aggiornare sulla directory
LDAP ospitata dal router il conteggio delle connessioni osservate tra
il client ed il server. A questo fine predisporre uno schema che
consenta di costruire un sottoalbero del DIT formato da un primo
livello di entry che rappresentino i client, ed un secondo livello di
entry che rappresentino i server a cui il client si è connesso (e
quante volte)
|
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
openclose.sh
snmpd.conf
count.schema
|
ssh
iptables
logging
inittab
kill
netstat
cron
at
ldap
snmp
|
24 maggio
|