Testo |
File |
Strumenti
impiegati |
Data
di svolgimento |
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 |
4
marzo
|
Utilizzare
le
funzionalità avanzate di sort (switch -k e -t) per ordinare per data di
nascita, a parità di data per cognome, a parità di entrambi per nome un
file nel formato Nome/Cognome/GG/MM/AAAA oppure
Nome/Cognome/AAAA/MM/GG |
sortnomi.sh |
sort
avanzato |
4
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 |
variabili
speciali $n
|
|
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 |
13
marzo
|
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 |
18
marzo
|
uid2.sh |
read,
apertura di subshell |
18
marzo
|
Estendere
l'esercizio precedente per verificare tutti gli intervalli tra UID
consecutivi
|
uid3.sh |
variabile
IFS, si veda anche duerighe.sh |
18
marzo
|
Stampare
gli username corrispondenti agli N più elevati
userid presenti nel file
/etc/passwd, essendo N un parametro passato sulla
riga di comando. |
5nomi-ciclo.sh
5nomi-awk.sh |
cut
avanzato, read di più variabili, cicli
while |
18
marzo
|
Mostrare
tutti gli username, chiedendo
all'utente conferma di un'ipotetica azione da svolgere per ciascuno. |
readterminal.sh
|
read
alimentato esplicitamente da terminale |
18
marzo
|
Configurare
rsyslog perchè i messaggi etichettati
local0.* prodotti su Client siano loggati nel file /var/log/attivita di
Server |
Client_rsyslog.conf
Server_rsyslog.conf |
rsyslog |
20
marzo
|
Predisporre
uno script che aggiorni in tempo reale le statistiche tratte da un file
/var/log/attivita, ad esempio permettendo di contare quante
righe sono comparse tra un'osservazione e la successiva, in modo
efficiente anche in caso di crescita del file rapida e raggiungimento
di grandi dimensioni.
Esercizio
proposto: aggiungere un "lanciatore" che esegua logwatch in
background e lo segnali ogni 10 secondi.
|
logwatch.sh |
funzioni,
signal handling, tail -f,
peculiarità delle subshell |
8
aprile
|
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 |
8
aprile
|
Modificare
l'esercizio precedente perchè accetti come parametri un numero
arbitrario di comandi da lanciare in parallelo, poi proceda alla
verifica periodica come sopra.
Esercizio
proposto: garantire che tutti i processi lanciati vengano
terminati se per qualsiasi motivo viene terminato il processo parallenne
|
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 $* $@ |
8
aprile
|
Realizzare
uno script che accetti sulla riga di comando
- "-n" seguito da un numero che sarà memorizzato
nella variabile NCOPIES; il parametro è opzionale e se assente NCOPIES
deve assumere il valore di default pari a 4.
- "-s" seguito da una stringa che sarà
memorizzata nella variabile LOGSIGNAL; il parametro è opzionale e se
assente LOGSIGNAL deve assumere il valore di default pari a USR1.
- una stringa che sarà memorizzata nella
variabile
LOGFILE
Lo script "ruota" il file LOGFILE per tenerne copie storiche con
estensione numerica (.1 corrisponde sempre al file generato più
recentemente, ogni rotazione salva il file con estensione .n nel file con estensione .n+1, con un valore massimo pari a
NCOPIES) e manda al processo che sta scrivendo sul file il segnale
LOGSIGNAL (default=USR1) per avvertirlo al momento giusto di chiudere e
riaprire il file.
Esercizio proposto: verificare
nel modo più preciso possibile che i parametri passati siano
sintatticamente e semanticamente corretti, e comprimere i file ruotati.
|
logrotate.sh
|
getopt,
spostamento
di file aperti, fuser, cicli for+seq, gzip
|
15
aprile
|
Nella
directory passata come primo parametro allo
script ed in tutte le subdirectory, individuare i file che non siano
stati modificati da più di un dato numero di
giorni (passato come terzo
parametro), e copiarli in una
directory passata come secondo parametro.
|
archiveflat.sh |
find |
15
aprile
|
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,
process substitution
|
15
aprile
|
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 |
17
aprile
|
Configurazione
di una rete
client-router-server, analisi e diagnostica del traffico |
Traccia della
configurazione e testing della rete
Come rendere
permaneneti le modifiche alla configurazione
|
ifconfig,
route, ping, wireshark, netstat
|
22
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.
Esercitazioni
proposte: completare gli script come da commenti all'interno delle
tracce
|
Variante
con tcpdump:
netmon.sh
connection_monitor.sh
traffic_monitor.sh
log_user.sh
Variante con iptables:
netmon.sh
connection_monitor.sh
traffic_monitor.sh
log_user.sh |
tcpdump
syslog
netstat
case
iptables
cron
|
22
aprile
29 aprile
13 maggio
|
Dato
un file di nome "testo" sulla macchina locale, 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 |
24
aprile
|
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 |
|
Configurare
il packet filter per una politica di "default deny", che blocchi tutto
ciò che non è esplicitamente consentito.
Esercizio proposto:
predisporre una salvaguardia che eviti di "chiudersi fuori" quando è
necessario configurare il packet filter su di una macchina remota
|
iptables.base.txt |
iptables
|
6
maggio
|
Configurare
il packet filter di Router perché consenta il traffico tra Client e
Server
- esponendo verso Server le connessioni come se fossero originate da
Router stesso
- accettando le connessioni da Client verso Router stesso e
ridirigendole verso Server
Esercizio proposto:
sperimentare con regole di conteggio per capire quando viene effettuato
il de-nat dei pacchetti ricevuti in risposta a pacchetti nat-tati
prodotti da Router
|
iptables.nat.txt
|
iptables
|
8
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 |
15
maggio
20 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
filesystem.ldif
ldap-fs-store.sh
ldap-fs-sumspace.sh
ldap-fs-purge.sh
|
/etc/ldap/*
ldapadd, ldapsearch, ldapmodify |
27
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.ldif
|
ssh
iptables
logging
inittab
kill
netstat
cron
at
ldap
snmp
|
3 giugno
|