giu 06
Proftpd traccia qualsiasi operazione nel file di log denominato xferlog. In effetti molti altri demoni FTP scrivono i log in un file con lo stesso nome e adottando lo stesso formato, quindi questa tip può interessare anche chi utilizza, ad esempio, Wu-Ftpd o altri FTP standard BSD.
Il file xferlog si trova di solito in una delle seguenti directory:
/var/log
/var/log/proftpd/xferlog
/var/www/vhosts/{DOMAIN}/statistics/logs/xferlog_regular*
L’ultimo caso particolare riguarda solo i server amministrati con Plesk.
L’ultimo carattere riportato in ogni riga del xferlog mostra il modo in cui si è completato il trasferimento. Se il carattere è “c” significa che l’operazione si è completata con successo; se il carattere è “i” significa - al constrario - che l’operazione non è stata copmpletata e il trasferimento ha avuto pertanto esito negativo.
Questo comando restituisce tutti i trasferimenti incompleti:
egrep "i$" /path/to/xferlog
I tre caratteri che seguono il nome del file rappresentano nell’ordine:
- il tipo di trasferimento (a=ascii, b=binary)
- ogni eventuale azione particolare intrapresa (di norma viene riportato il carattere “_” che corrisponde a “nessuna azione”)
- la direzione del trasferimento (o=outgoing, i=incoming, d=deleted)
Per estrarre - ad esempio - una lista di tutti i file uploadati con successo:
awk '($12 ~ /^i$/ && $NF ~ /^c$/){print $9}' /var/log/proftpd/xferlog
Al contrario, per estrarre una lista di tutti i file il cui upload è fallito:
awk '($12 ~ /^i$/ && $NF ~ /^i$/){print $9}' /var/log/proftpd/xferlog
giu 04
Mi è capitato in questi giorni di dover ripulire le mailbox di alcuni clienti svuotandole di tutti i messaggi più vecchi di un certo numero di giorni. Volendo automatizzare questa operazione piuttosto noiosa, ho spulciato fra le mie vecchie cose ed ho ritrovato uno script che assolve egregiamente il compito. Si tratta del programma cleanup-maildir scritto nel linguaggio di programmazione Python e dotato di una serie di funzionalità avanzate per la manipolazione delle Maildir.
Senza entrare troppo nel dettaglio (chi vuole può lanciare il programma con il consueto parametro “-h”) ecco il comando con cui si possono cancellare definitivamente tutti i messaggi più vecchi di 90 giorni:
./cleanup-maildir --age=90 --maildir-root='/home/nomeutente/Maildir' delete ''
Più semplice di così… Di seguito metto a disposizione lo script originale, anche se suggerisco di tenere d’occhio questo link per una versione sempre aggiornata:
mag 27
Non dovrebbe. Ma può senz’altro succedere che si cancelli un file per errore e lo si voglia recuperare. Ci sono svariati tool a pagamento per effettuare questo tipo di operazione su filesystem FAT32 e NTFS sotto Windows. Anche il nostro pinguino offre più di uno strumento simile per recuperare file cancellati su filesystem EXT3. Uno fra questi è ext3birra, un programma per Linux il cui nome inconfondibilmente italico deriva dal nickname del programmatore che l’ha ideato.
Da quanto si legge sul sito ufficiale del progetto, questo utilissimo programma è stato scritto in soli 5 giorni e permette di recuperare solo file eliminati recentemente (entro le 24 ore).
Ecco come utilizzare il s/w:
- scaricare il programma da questo indirizzo
- estrarre i file con il consueto comando:
tar -jxvf ext3birra*.tar.bz2
- spostarsi nella cartella così creata e lanciare il comando:
make && make install
- terminata la compilazione, per usare ext3birra è sufficiente lanciare il comando:
ext3birra [device] [output directory]
Ecco ad esempio come si possono recuperare i files precedentemente eliminati dalla partizione sda1, ripristinandoli nella directory temporanea /tmp/recupero_dati/:
ext3birra /dev/sda1 /tmp/recupero_dati/
mag 26
Per cambiare in maniere definitiva la hostname di una Linux box - l’esempio si riferisce come sempre ad una Debian Etch - non è sufficiente ricorrere al comando `hostname`:
hostname nuovonome
Per evitare che le impostazioni si perdano definitivamente al primo reboot, devi sostituire il nome di host anche nel file:
/etc/hostname
Quando si compie un’operazione di questo tito, 9 volte su 10 si rende necessario anche un aggiornamento del file:
/etc/mailname
Attenzione! Quest’ultimo deve contenere l’intero dominio, nel mio caso:
nuovonome.agliardi.net
mag 26
La scorsa settimana ero da un cliente ed è successa una cosa divertente. Mi sono messo a lavorare su un cluster di server Debian che gestisce le unità disco di backup per tutta la VPN, una macchina piuttosto critica poiché l’azienda ha sedi in tutta Italia e tutto - o quasi - prima o poi deve passare per quel server.
Il tecnico che mi è stato affidato dalla società è un bravo informatico con una solida preparazione sui sistemi server di casa Microsoft. Una sola carenza: conoscenza zero della lingua inglese. Ha studiato francese. Mi chiedo come si possa fare l’informatico senza una conoscenza molto buona della lingua inglese. Ma non importa.
Dato che stavamo uno a fianco all’altro e che non mi andava di fare a traduzione al volo di ogni `man` aperto, ho lanciato il comando:
dpkg-reconfigure locales
ed ho impostato la lingua di sistema su it_IT.UTF-8.
Ebbene, sto ancora cercando di spiegare al tecnico, con cui nel frattempo ho fatto amicizia, come Debian gestisca questo tipo di operazione senza la necessità di riavviare il server. Ma non ce la farò mai: parliamo proprio un’altra lingua io e lui. Non te la prendere!
mag 21
Detroit (USA) - Con una mossa destinata a dare un’ulteriore spinta alla diffusione del Pinguino sul mercato embedded, Intel e Wind River hanno annunciato lo sviluppo congiunto di una piattaforma open source Linux-based per l’industria automobilistica. Leggi il resto »
mag 19
Con il passare del tempo ogni sistema operativo tende ad accumulare porzioni di codice che - a causa delle normali attività di installazione, upgrade e disinstallazione del software - diviene obsoleto e destinato a non essere mai più utilizzato. Le cosiddette distro “Debian based” mettono a disposizione uno strumento potente e al tempo stesso semplice per risolvere il problema: il programma `deborphan`.
Questa applicazione non fa altro che fornire la lista completa dei pacchetti che non dipendono da nessun altro pacchetto, nemmeno dal core del sistema operativo, la cui presenza è quindi assolutamente superflua:
ziovanja:~# deborphan
opensyncutils
libalut0
libsynaptics0
plib1.8.4c2
libicu36
libxt-java
libportaudio0
libportaudio2
libdivxdecore0-binary
libneon26-gnutls
gstreamer0.10-fluendo-mp3
libhsqldb-java
libavahi-compat-howl0
gstreamer0.10-pitfdll
libdivxencore0-binary
php5-ming
libmdbtools
kdebindings-java
libdvdplay0
bsdtar
libdivx0-binary
Combinando il comando `deborphan` con `apt-get` si può facilmente ottenere la rimozione di tutti i pacchetti inutilizzati:
apt-get remove --purge `deborphan`
Attenzione! Per ovvie ragioni la rimozione di un pacchetto può generare a sua volta nuovi deborphans, quindi è necessario lanciare l’istruzione sopra più volte, fino a che non si ottiene la completa rimozione di tutti i pacchetti orfani. Provare per credere!
mag 15
Questa volta la vulnerabilità segnalata dal team Debian Security Advisory è di quelle che devono far correre ai ripari - è il caso di dirlo - anche il sysadmin più easy!
Come raramente accade, questa volta il problema è specifico della distro Linux, anche se si tratta di una conseguenza indiretta del bug non Debian-specific scoperto pochi giorni fa nell’applicazione OpenSSH. Per dirla in poche parole, tutte le chiavi host e user generate per ogni connessione SSH dal pacchetto `openssh` buggato sono completamente inaffidabili, poiché la loro generazione non è avvenuta seguendo un algoritmo di randomizzazione valido e sono pertanto facilmente “prevedibili”.
Per le persone sagge, allego in calce a questo post il comunicato del DSA.
Risolvere il problema è comunque un gioco da ragazzi. È sufficiente lanciare:
apt-get dist-upgrade
e confermare il prompt che riproduco qui di seguito:

Ecco infine il Debian Security Advisory DSA-1576-1. Buona lettura!
mag 09
Questa è stata una settimana molto, molto dura… ma non posso certo permettere che si concluda senza avere messo online almeno una piccola, miserabile, insignificante tip! Quindi, per fare le cose al volo, vi dico come effettuo la sincronizzazione di un sito Internet che ho elaborato in locale con la copia che è pubblicata nella directory di un certo spazio FTP.
Premetto che questo non è il modo in cui lavoro normalmente: da buon figlio degli anni ‘70 io modifico il codice direttamente online, non in produzione, ma online (bash). Questa settimana mi è capitato però di dover mettere mano al sito Internet di un cliente che ha messo a mia disposizione solo ed esclusivamente il suo account FTP. Quindi ho cominciato a sviluppare una copia locale del suo sito internet e tengo sincronizzata la versione online con un solo, semplice, meraviglioso comando:
lftp -u 'username,password‘ ftp.mydomain.com -e “set ftp:ssl-protect-data true;mirror –reverse /home/ivan/test test; exit
In altre parole:
- username: il nome utente dell’account FTP
- password: la password associata al nome utente dell’account FTP
- ftp.mydomain.com: la host dell’account FTP
- /home/ivan/test: la cartella locale (senza slash finale)
- test: la cartella remota (ovvero quella dove si trova pubblicato il sito Internet)
Da notare l’opzione “set ftp:ssl-protect-data true” che protegge l’autenticazione FTP mediante ssl e l’opzione “mirror –reverse” che permette di sincronizzare in upload anziché in download.
Inutile dire che con lo stesso comando si può mantenere un backup remoto di una directory locale, anche se per cose di questo tipo è consigliabile l’utilizzo di `rsync` che fa tutto attraverso una connessione `ssh`.
Niente di più, niente di meno. Buon week end!
mag 02
Mi capita spesso di dover spostare in massa una grande quantità di file accomunati da una porzione del nome (quasi sempre l’estensione). Ecco la riga di codice che utilizzo in bash per ottenere - ad esempio - lo spostamento di tutti i file con estensione .gz contenuti nella directory corrente (comprese tutte le subdirectory in essa contenute) nella directory target che si chiama /tmp/prova:
find . -type f -name "*.gz" -exec mv {} /tmp/prova \;