Archivio della categoria 'Shell'

Directory public_html con uno script bash

Apache, Open Source, Shell, Sistema, Tips & tricks Nessun commento »

Mi è capitato spesso di dover mettere mano a server UNIX/Linux con una gestione dei VirtualHost di Apache compromessa da anni di utilizzo incontrollato del server da parte di amministratori di sistema non proprio ordinati. Il risultato di solito è un grande numero di utenti con home directory strutturate in maniera differente l’una dall’altra.

In particolare, in un caso recente mi sono ritrovato un centinaio di utenti dei quali una certa parte aveva la DocumentRoot nella propria home directory, altri invece ce l’avevano sotto /var/www/users/, cosa che io raccomando in quanto evita di avere problemi con SUEXEC nelle versioni di Apache precompilate.

Per sistemare una situazione così caotica ho deciso di mettere tutto correttamente sotto /var/www/users/ e mi si è presentata la necessità di creare automaticamente le directory mancanti e i relativi link simbolici alle varie home directory. L’ho fatto con un semplicissimo script in bash, che pubblico qui nel caso possa essere utile anche a qualcun altro. Ci ho messo anche un po’ di output per rendere il codice chiaro anche a chi è alle prima armi con la bash.

Attenzione! Alla riga 18 viene fatta la copia di un fast-cgi presente nella directory /var/www/users/ivan/. Ovvio che dovete sostituire ivan con il nome di un utente presente sul vostro server.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
 
echo "Inizializzazione script..."
 
for i in $( ls /home/ ); do
  echo "  Sto processando '$i'"
  if [ -L /home/$i/public_html ]; then
    echo "    Il link simbolico /home/$i/public_html esiste gia' ... salto!"
  else
    echo "    Il link simbolico /home/$i/public_html non esiste: provo a crearlo ... "
    if [ -d /var/www/users/$i ]; then
      echo "La directory /var/www/users/$i esiste, non mi resta che linkarla ... "
      /bin/ln -s /var/www/users/$i /home/$i/public_html
    else
      echo "    La directory /var/www/users/$i NON esiste, ora la creo ... "
      /bin/mkdir /var/www/users/$i
      echo "    Copio il FAST-CGI ... "
      /bin/cp /var/www/users/ivan/fast-cgi /var/www/users/$i/
      echo "    Sistemo i permessi per la directory creata ... "
      /bin/chown -R $i:$i /var/www/users/$i
      /bin/chmod 700 /var/www/users/$i
      echo "    Creo il link simbolico ... "
      /bin/ln -s /var/www/users/$i /home/$i/public_html
    fi
  fi
done
Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Piccola guida ai principali comandi Linux

Debian, Open Source, Segnalazioni, Shell, Sistema, Tips & tricks Nessun commento »

Riproduco in questo post la tabella realizzata da Pádraig Brady e pubblicata sul suo sito Internet ufficiale (http://www.pixelbeat.org). La tabella mostra alcuni fra i principali comandi per amministrare un server Linux, con una breve spiegazione e - in alcuni casi - link a pagine di approfondimento.

This is a linux command line reference for common operations. Examples marked with • are valid/safe to paste without modification into a terminal, so you may want to keep a terminal window open while reading this so you can cut & paste. All these commands have been tested both on Fedora and Ubuntu.

Leggi il resto »

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Cambiare i permessi di una directory ricorsivamente

Open Source, Shell, Sistema, Tips & tricks 2 commenti »

Pubblico qui una tip di poche, pochissime parole per una persona che mi ha chiesto come si possano cambiare ricorsivamente i permessi di tutto il contenuto di una directory in maniera corretta e - soprattutto - indolore. Posto che vogliamo assegnare ai file permessi 644 e alle directory 755 - come sempre andrebbe fatto - è sufficiente spostarsi nella directory in questione e lanciare i comandi che seguono:

find . -type f -print0 | xargs -0 chmod 644

find . -type d -print0 | xargs -0 chmod 755

Altro non serve…

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Monitoraggio delle code di posta con Postfix

Open Source, Shell, Sistema, Tips & tricks Nessun commento »

Postfix è considerato da tempo uno tra i migliori MTA in circolazione. Scritto inizialmente da Wietse Zweitze Venema e rilasciato sotto IBM Public License, Postfix può vantare una solidità ed una facilità di interazione introvabili in altri demoni di posta SMTP.

La scelta di distribuire le sue funzionalità su diversi demoni - ognuno dei quali svolge una funzione specifica - e l’attribuzione di diritti minimi di esecuzione ad ognuno di essi, garantisce che un eventuale bug o exploit non possa compromettere l’intero MTA. Un solo processo deve essere eseguito con privilegi di root, tutti gli altri hanno diritti minimi e spesso un file di configurazione proprio.

Questa distribuzione di compiti si traduce anche nella disponibilità di diversi strumenti specificamente dedicati a svolgere funzioni di monitoraggio e di amministrazione dei processi generati da Postfix. Alcuni di questi strumenti sono parte integrante di Postfix, mentre altri costituiscono elementi accessori - spesso sviluppati da terze parti - che interagiscono con esso a vari livelli.

Il monitoraggio delle code di posta, ad esempio, può avvenire mediante il programma `mailq`:

# mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
6CC39230001* 1389 Wed Jun 25 01:17:51 5tanya.wuhc@msa.hinet.net
test@dominio.it

Rimando i newbie al solito `man mailq` per le informazioni principali su come funziona il programma. Quello che segue è invece un esempio di come si possa utilizzare al meglio `mailq` per rimuovere la posta bloccata dallo spool locale:

# exim -Mg `mailq | grep frozen | awk '{ print $3 }'`

Il normale utilizzo di `mailq` può essere ostacolato dalla presenza di code di posta molto voluminose. In questi casi è bene ricorrere allo script `qshape` per avere una quadro chiaro su cosa abbia determinato l’accumulo di messaggi e quando sia accaduto:

$ qshape -s deferred | head
T 5 10 20 40 80 160 320 640 1280 1280+
TOTAL 1250 0 1 2 4 5 22 34 118 242 822
spammer123.com 462 0 1 0 1 1 3 7 15 53 381
zzfinder.com 64 0 0 0 0 0 1 0 0 4 59
socket4you.biz 53 0 0 0 0 0 0 0 0 0 53
junglex.com 36 0 0 0 0 0 1 3 7 15 10
myemessage.com 36 0 0 0 0 0 0 0 0 0 36
stock911.us 35 0 0 0 0 0 0 0 0 0 35
linuxassistance.it 33 0 0 0 0 0 0 0 0 0 33
agliardi.biz 29 0 0 0 0 0 0 0 0 3 26

Qui si vede come ci siano 1250 messaggi in coda per i quali è stato fatto almeno un tentativo di spedizione (deferred), di cui 462 sono indirizzati al dominio spammer123.com. Delle email inviate a questo dominio 1 è in coda per un periodo di tempo compreso fra 5 e 10 minuti, mentre 381 sono in attesa da più di 1280 minuti.

Il comando che segue serve invece per visualizzare le statistiche legate al numero di destinatari delle mail presenti nella coda “active” di Postfix:

qshape active | less

In questo modo siamo in grado di individuare in ogni momento eventuali “colli di bottiglia”, ovvero invii di posta elettronica anomali che si accumulano nella coda di Postfix degradandone nettamente le prestazioni. Una volta individuati simili processi, li si può debellare con l’ausilio del comando `postsuper`:

postsuper [-psv] [-c directory_file_conf] [-d][-h][-H][-r] [id_coda] [directory_coda]

Per eliminare, ad esempio, il messaggio con ID di coda 6CC39230001 (ovvero quello riportato nell’esempio fatto sopra) è sufficiente lanciare il comando:

# postsuper -d 6CC39230001

Se invece, a vostro rischio e pericolo, volete svuotare completamente le code di posta, potete sempre ricorrere al seguente comando:

# postsuper -d ALL deferred

Ma se mai doveste perdere messaggi di posta elettronica a causa dell’utilizzo di questo secondo esempio, non ve la prendete con me.

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Analizzare i transfer log (xferlog) di proftpd

Debian, Open Source, Shell, Sistema, Tips & tricks 2 commenti »

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:

  1. il tipo di trasferimento (a=ascii, b=binary)
  2. ogni eventuale azione particolare intrapresa (di norma viene riportato il carattere “_” che corrisponde a “nessuna azione”)
  3. 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

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Eliminare i vecchi messaggi di posta con uno script (python)

Open Source, Shell, Sistema, Tips & tricks Nessun commento »

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:

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Mamma, ho scordato la password di root!

Debian, Shell, Sistema, Tips & tricks Nessun commento »

Per la serie RTFM, riporto di seguito le istruzioni in italiano riportate sulla documentazione ufficiale di Debian per il recupero della password di root. Lo faccio ad uso e consumo di una persona molto pigra che me lo ha chiesto.

8.1.1 “Ho scordato la password di root!” (1)

E’ possibile fare il boot del sistema ed accedere all’account di root, anche se non se ne conosce la password, basta avere accesso alla tastiera. (Premesso che che non esistono altre password richieste dal BIOS, o dal boot-loader tipo lilo che possono impedirvi l’accesso al sistema).

Questa procedura non richiede alcun disco di boot, nè cambiamenti al BIOS. In questo contesto, “Linux” è l’etichetta per lanciare il kernel in una installazione Debian standard.

Alla schermata di boot di lilo, non appena appare boot: (in alcuni sistemi si deve premere il tasto maiuscolo per prevenire il boot automatico) e se lilo usa il framebuffer dovete premere TAB per vedere le opzioni che digitate), date:

boot: Linux init=/bin/sh

Il sistema avvia il kernel ed esegue /bin/sh invece dello standard init. A questo punto avete ottenuto i privilegi di root e la shell di root. Siccome, però / è montata in sola lettura e molte altre partizioni non sono state ancora montate, avete bisogno di eseguire quanto segue per avere un sistema ragionevolmente funzionante.

init-2.03# mount -n -o remount,rw /
init-2.03# mount -avt nonfs,noproc,nosmbfs
init-2.03# cd /etc
init-2.03# vi passwd
init-2.03# vi shadow

(Se il secondo campo di dati all’interno di /etc/passwd è “x” per ogni username, il vostro sistema usa le shadow password, per cui dovrete modificare /etc/shadow.) Per disabilitare la password di root, modificate il secondo campo nel file password in maniera che risulti vuoto. Ora potete fare il reboot ed il log in come root senza una password. Quando fa il boot nel runlevel 1, Debian (almeno dopo Potato) richiede una password, mentre alcune distribuzioni più vecchie no.

E’ buona cosa avere un piccolo editor in /bin nel caso in cui /usr non fosse accessibile (vedere Editor di salvataggio, Sezione 11.2).

Considerate anche l’installazione del pacchetto sash. Se il sistema diventa non più avviabile, eseguite:

boot: Linux init=/bin/sash

sash funziona come sostituto interattivo di sh persino quando /bin/sh è inutilizzabile. Ha un collegamento statico ed include molte utilità di base al suo interno (digitate “help” al prompt per una lista di riferimento).

8.1.2 “Ho scordato la password di root!” (2)

Fate il boot da qualunque set di dischi di emergenza boot/root. Se, per esempio, /dev/hda3 è la partizione di root originale, i seguenti comandi permetteranno di aprire il file password facilmente come sopra.

# mkdir fixit
# mount /dev/hda3 fixit
# cd fixit/etc
# vi shadow
# vi passwd

Il vantaggio di questo approccio rispetto al metodo precedente è che non richiede la conoscenza della password di lilo (se esiste). Però, bisogna essere in grado di impostare il BIOS, se non lo è già, in modo che il boot del sistema sia da floppy o da CD.

Fonte: http://www.debian.org/doc/manuals/reference/ch-tips.it.html

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

ext3birra e recupero di file cancellati su Linux

Backup, Open Source, Shell, Sistema, Tips & tricks Nessun commento »

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/

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Eliminare pacchetti inutili con deborphan e apt-get

Debian, Open Source, Shell, Tips & tricks Nessun commento »

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!

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Sincronizzazione mediante `lftp`

Backup, Open Source, Shell, Sistema, Tips & tricks 2 commenti »

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,passwordftp.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!

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb