Dopo aver parlato del comando fuser, ecco un altro interessante comando utilizzato per individuare file aperti, e non solo. lsof è un comando molto complesso: per una completa trattazione vi rimandiamo alla man page.
In particolare, secondo l’ormai nota implementazione di ogni sistema UNIX, dove ogni cosa (per esempio pipe, directory, device, i-node e socket) viene trattata come se fosse un semplice file, il comando lsof, eseguito senza parametri, restituisce tutti i file aperti da qualsiasi programma correntemente in esecuzione.
Per restringere tale output (che omettiamo per mancanza di spazio) a quei processi posseduti da uno specifico utente, è possibile utilizzare l’opzione -u, come mostrato in quest’esempio
lsof -u m4xp0w3r
COMMAND PIO FD TYPE DEVICE NODE NAME
sshd 2354 mem REG 254,0 105723 /lib/libcap.so.1.10
sshd 2354 DEL REG 0,8 127123574 /dev/zero
bash 2363 cwd DIR 254,4 7274497 /home/m4xp0w3r
bash 2363 txt REG 254,0 4126 /bin/bash
bash 2363 mem REG 254,0 105698 /lib/ld-2.5.so
Di seguito si riportano alcune note sulle informazioni meno comprensibili riportate in queste diverse colonne di output che dovrebbero poi essere integrate dalla vostra curiosità.
La colonna FD mostra le informazioni circa il file descriptor associato al processo: ad esempio la stringa cwd indica la directory di lavoro corrente mentre la stringa mem indica una risorsa presente in memoria.
La colonna TYPE riporta informazioni circa il tipo di file: ad esempio la stringa REG indica un file regolare (normale) mentre la stringa DIR una directory del filesystem.
La colonna DEVICE riporta il device associato al processo (rispettivamente major-number, minor-number) mentre la colonna NODE può essere utile se si sta tentando di recuperare un file cancellato.
Il comando lsof <filename> mostra quali processi hanno dei file aperti con il nome specificato mentre lsof +D <dir> mostra quali processi hanno dei file aperti nella directory specificata. Entrambe le opzioni, ed in particolare quest’ultima, possono essere molto utili se ad esempio si sta tentando di smontare un filesystem senza successo a causa di un messaggio di errore del tipo filesystem in use.
Altre utilizzi tipici possono essere:
lsof -e <processname>
mostra tutti i processi che corrispondono o che iniziano con la stringa specificata i quali hanno file aperti.
lsof -i
mostra tutte le informazioni in riferimento a socket IP. In particolare quest’ultima modalità ci consente di individuare eventuali problemi di sicurezza piuttosto che semplicemente monitorare l’attività dei nostri server in rete.
Ad esempio, in combinazione con il comando watch, è possibile monitorare in tempo reale, di default ogni 2 secondi (CTRL+C per uscire). cosa stia accadendo al nostro server web (porta 80) in questo modo:
watch lsof -i :80
Tramite questo comando è quindi possibile individuare quali host stanno accedendo il nostro server web, mentre attraverso il comando:
lsof -i@<hostname_or_ip_address>
è possibile controllare tutte le connessioni di un particolare host alla nostra Linux Box, come mostrato dal seguente output semplificato (dove viene individuata una sola connessione SSH effettuata dal client 192.168.0.2):
COMMAND PID TYPE NAME
sshd 10128 IPv6 192.168.O.1: ssh->192.168.O.2:1735
Infine è possibile recuperare informazioni simili, relativamente ai socket UNIX aperti sulla nostra Linux Box, mediante l’opzione -U.
Si ricorda che i socket UNIX sono utilizzati per gestire la comunicazione inter-processo, dove, in altre parole, il concetto di rete (relativo ai socket IP) è sostituito dalla singola macchina locale.
Questa opzione spesso viene utilizzata in combinazione con il comando strace quando si sta tentando di tracciare dei bug di sistema a basso livello.