Πώς να χρησιμοποιήσετε την εντολή lsof του Linux

Εάν τα πάντα στο Linux είναι ένα αρχείο, πρέπει να υπάρχουν περισσότερα από αρχεία στον σκληρό σας δίσκο. Αυτό το σεμινάριο θα σας δείξει πώς να χρησιμοποιήσετε το lsof για να δείτε όλες τις άλλες συσκευές και διαδικασίες που αντιμετωπίζονται ως αρχεία.

Πίνακας περιεχομένων

Στο Linux, τα πάντα είναι ένα αρχείο

Η συχνά αναφερόμενη φράση ότι τα πάντα στο Linux είναι ένα αρχείο είναι κάπως αληθινή. Ένα αρχείο είναι μια συλλογή από byte. Όταν διαβάζονται σε ένα πρόγραμμα ή αποστέλλονται σε εκτυπωτή, φαίνεται να δημιουργούν μια ροή byte. Όταν τους γράφονται, δέχονται μια ροή byte.

Πολλά άλλα στοιχεία του συστήματος δέχονται ή δημιουργούν ροές byte, όπως πληκτρολόγια, συνδέσεις υποδοχής, εκτυπωτές και διαδικασίες επικοινωνίας. Επειδή είτε δέχονται, δημιουργούν, είτε δέχονται και δημιουργούν ροές byte, αυτές οι συσκευές μπορούν να αντιμετωπιστούν —σε πολύ χαμηλό επίπεδο— σαν να ήταν αρχεία.

Αυτή η ιδέα σχεδίασης απλοποίησε την υλοποίηση του λειτουργικού συστήματος Unix. Αυτό σήμαινε ότι ένα μικρό σύνολο χειριστών, εργαλείων και API θα μπορούσε να δημιουργηθεί για να χειριστεί ένα ευρύ φάσμα διαφορετικών πόρων.

Τα αρχεία δεδομένων και προγραμμάτων που βρίσκονται στον σκληρό σας δίσκο είναι απλά παλιά αρχεία συστήματος αρχείων. Μπορούμε να χρησιμοποιήσουμε την εντολή ls για να τα απαριθμήσουμε και να μάθουμε κάποιες λεπτομέρειες για αυτά.

Πώς μαθαίνουμε για όλες τις άλλες διαδικασίες και συσκευές που αντιμετωπίζονται σαν να ήταν αρχεία; Χρησιμοποιούμε την εντολή lsof. Αυτό παραθέτει τα ανοιχτά αρχεία στο σύστημα. Δηλαδή, παραθέτει οτιδήποτε γίνεται αντικείμενο χειρισμού σαν να ήταν αρχείο.

Το lsof Command

Πολλές από τις διεργασίες ή τις συσκευές για τις οποίες μπορεί να αναφέρει το lsof ανήκουν στο root ή εκκινήθηκαν από το root, επομένως θα χρειαστεί να χρησιμοποιήσετε την εντολή sudo με το lsof.

Και επειδή αυτή η καταχώριση θα είναι πολύ μεγάλη, πρόκειται να τη διαβιβάσουμε λιγότερα.

sudo lsof | less

Πριν εμφανιστεί η έξοδος lsof, οι χρήστες του GNOME ενδέχεται να δουν ένα προειδοποιητικό μήνυμα στο παράθυρο του τερματικού.

lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.

Το lsof προσπαθεί να επεξεργαστεί όλα τα προσαρτημένα συστήματα αρχείων. Αυτό το προειδοποιητικό μήνυμα εμφανίζεται επειδή το lsof αντιμετώπισε ένα Εικονικό σύστημα αρχείων GNOME (GVFS). Πρόκειται για ειδική περίπτωση α σύστημα αρχείων στο χώρο χρήστη (ΑΣΦΑΛΕΙΑ ΗΛΕΚΤΡΙΚΗ). Λειτουργεί ως γέφυρα μεταξύ του GNOME, των API του και του πυρήνα. Κανείς —ακόμη και ο root— δεν μπορεί να έχει πρόσβαση σε ένα από αυτά τα συστήματα αρχείων, εκτός από τον κάτοχο που το προσάρτησε (στην περίπτωση αυτή, το GNOME). Μπορείτε να αγνοήσετε αυτήν την προειδοποίηση.

  Το Systemd θα αλλάξει τον τρόπο με τον οποίο λειτουργεί ο οικιακός κατάλογος Linux

Η έξοδος από το lsof είναι πολύ μεγάλη. Οι πιο αριστερές στήλες είναι:

Οι πιο δεξιές στήλες είναι:

Οι Στήλες lsof

Όλες οι στήλες δεν ισχύουν για κάθε τύπο ανοιχτού αρχείου. Είναι φυσιολογικό κάποιες από αυτές να είναι κενές.

Εντολή: Το όνομα της εντολής που σχετίζεται με τη διαδικασία που άνοιξε το αρχείο.
PID: Αριθμός αναγνώρισης διεργασίας της διαδικασίας που άνοιξε το αρχείο.
TID: Εργασία (νήμα) Αριθμός αναγνώρισης. Μια κενή στήλη σημαίνει ότι δεν είναι μια εργασία. είναι μια διαδικασία.
Χρήστης: Αναγνωριστικό χρήστη ή όνομα του χρήστη στον οποίο ανήκει η διαδικασία ή το αναγνωριστικό χρήστη ή σύνδεση του ατόμου που κατέχει τον κατάλογο στο /proc όπου το lsof βρίσκει πληροφορίες σχετικά με τη διαδικασία.
FD: Εμφανίζει την περιγραφή αρχείου του αρχείου. Οι περιγραφείς αρχείων περιγράφονται παρακάτω.
Τύπος: τύπος κόμβου που σχετίζεται με το αρχείο. Οι τύποι σημειώσεων περιγράφονται παρακάτω.
Συσκευή: Περιέχει είτε τους αριθμούς συσκευών, διαχωρισμένους με κόμματα, για έναν ειδικό χαρακτήρα, ειδικό μπλοκ, κανονικό, κατάλογο ή αρχείο NFS, είτε μια διεύθυνση αναφοράς πυρήνα που προσδιορίζει το αρχείο. Μπορεί επίσης να εμφανίζει τη βασική διεύθυνση ή το όνομα συσκευής μιας συσκευής υποδοχής Linux AX.25.
Μέγεθος/Απενεργοποίηση: Δείχνει το μέγεθος του αρχείου ή τη μετατόπιση του αρχείου σε byte.
Κόμβος: Εμφανίζει τον αριθμό κόμβου ενός τοπικού αρχείου ή τον αριθμό εισόδου ενός αρχείου NFS στον κεντρικό υπολογιστή διακομιστή ή τον τύπο πρωτοκόλλου Διαδικτύου. Μπορεί να εμφανίζει το STR για μια ροή ή τον αριθμό IRQ ή inode μιας συσκευής υποδοχής Linux AX.25.
Όνομα: Εμφανίζει το όνομα του σημείου προσάρτησης και του συστήματος αρχείων στο οποίο βρίσκεται το αρχείο.

Η στήλη FD

Ο περιγραφέας αρχείου στη στήλη FD μπορεί να είναι μία από τις πολλές επιλογές. η σελίδα του ανθρώπου απαριθμήστε τα όλα.

Η καταχώρηση στήλης FD μπορεί να αποτελείται από τρία μέρη: μια περιγραφή αρχείου, έναν χαρακτήρα τρόπου λειτουργίας και έναν χαρακτήρα κλειδώματος. Μερικοί συνήθεις περιγραφείς αρχείων είναι:

cwd: Τρέχων κατάλογος εργασίας.
err: Σφάλμα πληροφοριών FD (βλ. στήλη ΟΝΟΜΑ).
ltx: Κοινόχρηστο κείμενο βιβλιοθήκης (κώδικας και δεδομένα).
m86: Αντιστοιχισμένο αρχείο συγχώνευσης DOS.
mem: Αρχείο με αντιστοίχιση μνήμης.
mmap: Συσκευή με χαρτογράφηση μνήμης.
pd: Γονικός κατάλογος.
rtd: Κατάλογος ρίζας.
txt: Κείμενο προγράμματος (κωδικός και δεδομένα)
Ένας αριθμός, που αντιπροσωπεύει μια περιγραφή αρχείου.

Ο χαρακτήρας λειτουργίας μπορεί να είναι ένα από τα ακόλουθα:

r: Πρόσβαση ανάγνωσης.
w: Πρόσβαση εγγραφής.
u: Πρόσβαση ανάγνωσης και εγγραφής.
‘ ‘: Ένας χαρακτήρας διαστήματος, εάν η λειτουργία είναι άγνωστη και δεν υπάρχει χαρακτήρας κλειδώματος.
–: Η λειτουργία είναι άγνωστη και υπάρχει χαρακτήρας κλειδώματος.

Ο χαρακτήρας κλειδαριάς μπορεί να είναι ένας από τους:

r: Ανάγνωση κλειδώματος σε μέρος του αρχείου.
Ε: Διαβάστε το κλείδωμα σε ολόκληρο το αρχείο.
w: Εγγραφή κλειδώματος σε μέρος του αρχείου.
W: Γράψτε κλειδαριά σε ολόκληρο το αρχείο.
u: Διαβάστε και γράψτε κλειδαριά οποιουδήποτε μήκους.
U: Άγνωστος τύπος κλειδαριάς.
‘ ‘: Ένας διαστημικός χαρακτήρας. Χωρίς κλειδαριά.

Η στήλη TYPE

Υπάρχουν περισσότερες από 70 συμμετοχές που μπορεί να εμφανιστεί στη στήλη TYPE. Μερικές κοινές καταχωρήσεις που θα δείτε είναι:

REG: Κανονικό αρχείο συστήματος αρχείων.
DIR: Κατάλογος.
FIFO: First In First Out.
CHR: Ειδικό αρχείο χαρακτήρων.
BLK: Αποκλεισμός ειδικού αρχείου.
INET: Υποδοχή Internet.
unix: υποδοχή τομέα UNIX

Δείτε τις διαδικασίες που έχουν ανοίξει ένα αρχείο

Για να δείτε τις διεργασίες που έχουν ανοίξει ένα συγκεκριμένο αρχείο, δώστε το όνομα του αρχείου ως παράμετρο στο lsof. Για παράδειγμα, για να δείτε τις διεργασίες που έχουν ανοίξει το αρχείο kern.log, χρησιμοποιήστε αυτήν την εντολή:

sudo lsof /var/log/kern.log

Το lsof αποκρίνεται εμφανίζοντας τη μεμονωμένη διεργασία, rsyslogd που ξεκίνησε από το syslog χρήστη.

  Πώς να κάνετε το Linux να μοιάζει με το macOS

Δείτε όλα τα αρχεία που έχουν ανοίξει από έναν κατάλογο

Για να δείτε τα αρχεία που έχουν ανοίξει από έναν κατάλογο και τις διεργασίες που τα άνοιξαν, περάστε τον κατάλογο στο lsof ως παράμετρο. Πρέπει να χρησιμοποιήσετε την επιλογή +D (κατάλογος).

Για να δείτε όλα τα αρχεία που είναι ανοιχτά στον κατάλογο /var/log/, χρησιμοποιήστε αυτήν την εντολή:

sudo lsof +D /var/log/

Το lsof απαντά με μια λίστα με όλα τα ανοιχτά αρχεία σε αυτόν τον κατάλογο.

Για να δείτε όλα τα αρχεία που έχουν ανοίξει από τον κατάλογο /home, χρησιμοποιήστε την ακόλουθη εντολή:

sudo lsof +D /home

Εμφανίζονται τα αρχεία που έχουν ανοιχτεί από τον κατάλογο /home. Σημειώστε ότι με συντομότερες περιγραφές σε ορισμένες από τις στήλες, ολόκληρη η λίστα είναι πιο στενή.

Λίστα αρχείων που ανοίγονται από μια διαδικασία

Για να δείτε τα αρχεία που έχουν ανοίξει από μια συγκεκριμένη διαδικασία, χρησιμοποιήστε την επιλογή -c (εντολή). Σημειώστε ότι μπορείτε να παρέχετε περισσότερους από έναν όρους αναζήτησης στο lsof ταυτόχρονα.

sudo lsof -c ssh -c init

Το lsof παρέχει μια λίστα με τα αρχεία που έχουν ανοιχτεί από οποιαδήποτε από τις διεργασίες που παρέχονται στη γραμμή εντολών.

Δείτε τα Αρχεία που άνοιξαν ένας χρήστης

Για να περιορίσετε την εμφάνιση στα αρχεία που έχουν ανοίξει ένας συγκεκριμένος χρήστης, χρησιμοποιήστε την επιλογή -u (χρήστης). Σε αυτό το παράδειγμα, θα εξετάσουμε τα αρχεία που έχουν ανοίξει από διεργασίες που ανήκουν ή εκκινούνται για λογαριασμό της Mary.

sudo lsof -u mary

Όλα τα αρχεία που παρατίθενται έχουν ανοιχτεί για λογαριασμό του χρήστη Mary. Αυτό περιλαμβάνει αρχεία που έχουν ανοιχτεί από το περιβάλλον επιφάνειας εργασίας, για παράδειγμα, ή απλώς ως αποτέλεσμα της σύνδεσης της Mary.

Εξαιρούνται τα αρχεία που έχουν ανοίξει ένας χρήστης

Για να εξαιρέσετε τα αρχεία που έχουν ανοίξει ένας χρήστης, χρησιμοποιήστε τον τελεστή ^. Η εξαίρεση χρηστών από την καταχώριση διευκολύνει την εύρεση των πληροφοριών που σας ενδιαφέρουν. Πρέπει να χρησιμοποιήσετε την επιλογή -u όπως πριν και να προσθέσετε τον χαρακτήρα ^ στην αρχή του ονόματος του χρήστη.

sudo lsof +D /home -u ^mary

Αυτή τη φορά, η καταχώριση για τον κατάλογο /home δεν περιλαμβάνει κανένα από τα αρχεία που έχουν ανοίξει ο χρήστης Mary.

Λίστα αρχείων που ανοίγονται από μια διαδικασία

Για να παραθέσετε τα αρχεία που έχουν ανοίξει από μια συγκεκριμένη διεργασία, χρησιμοποιήστε την επιλογή -p (διαδικασία) και δώστε το αναγνωριστικό διεργασίας ως παράμετρο.

sudo lsof - p 4610

Όλα τα αρχεία που έχουν ανοιχτεί από το αναγνωριστικό διαδικασίας που παρέχετε παρατίθενται για εσάς.

Καταχώριση αναγνωριστικών διεργασιών που έχουν ανοίξει ένα αρχείο

Για να δείτε τα αναγνωριστικά διεργασίας για τις διεργασίες που έχουν ανοίξει ένα συγκεκριμένο αρχείο, χρησιμοποιήστε την επιλογή -t (terse) και δώστε το όνομα του αρχείου στη γραμμή εντολών.

sudo lsof -t /usr/share/mime/mime.cache

Τα αναγνωριστικά διεργασίας εμφανίζονται σε μια απλή λίστα.

Χρησιμοποιήστε τις αναζητήσεις AND και OR

Ας παραθέσουμε τα αρχεία που έχουν ανοίξει ο χρήστης Mary, τα οποία σχετίζονται με τις διαδικασίες SSH. Γνωρίζουμε ότι μπορούμε να παρέχουμε περισσότερα από ένα στοιχεία αναζήτησης στη γραμμή εντολών, επομένως αυτό θα πρέπει να είναι εύκολο.

sudo lsof -u mary -c ssh

Τώρα ας δούμε την έξοδο από το lsof. Αυτό δεν φαίνεται σωστό. υπάρχουν καταχωρήσεις στην έξοδο που ξεκίνησαν από τη ρίζα.

Δεν είναι αυτό που περιμέναμε. Τι συνέβη?

  Πώς να χρησιμοποιήσετε το Pipes στο Linux

Όταν παρέχετε πολλούς όρους αναζήτησης, το lsof θα επιστρέψει οποιοδήποτε αρχείο ταιριάζει με τον πρώτο όρο αναζήτησης ή τον δεύτερο όρο αναζήτησης κ.ο.κ. Με άλλα λόγια, εκτελεί μια αναζήτηση Ή.

Για να κάνετε το lsof να εκτελέσει μια αναζήτηση ΚΑΙ, χρησιμοποιήστε την επιλογή -a (και). Αυτό σημαίνει ότι τα μόνα αρχεία που θα παρατίθενται θα είναι αυτά που ταιριάζουν με τον πρώτο όρο αναζήτησης και τον δεύτερο όρο αναζήτησης κ.λπ.

Ας το δοκιμάσουμε ξανά και ας χρησιμοποιήσουμε την επιλογή -a.

sudo lsof -u mary -c ssh -a

Τώρα, κάθε αρχείο στην καταχώριση είναι ένα που έχει ανοίξει από ή για λογαριασμό της Mary και σχετίζεται με την εντολή SSH.

Αυτόματη ανανέωση της οθόνης

Μπορούμε να χρησιμοποιήσουμε την επιλογή +|-r (επανάληψη) για να θέσουμε το lsof σε λειτουργία επανάληψης. Η επιλογή επανάληψης μπορεί να εφαρμοστεί με δύο τρόπους, είτε +r είτε -r. Πρέπει επίσης να προσθέσουμε τον αριθμό των δευτερολέπτων που θέλουμε να περιμένει πριν ανανεώσουμε την οθόνη.

Η χρήση της επιλογής επανάληψης σε οποιαδήποτε μορφή κάνει το lsof να εμφανίζει τα αποτελέσματα ως συνήθως, αλλά προσθέτει μια διακεκομμένη γραμμή στο κάτω μέρος της οθόνης. Περιμένει για τον αριθμό των δευτερολέπτων που παρέχονται στη γραμμή εντολών και στη συνέχεια ανανεώνει την οθόνη με ένα νέο σύνολο αποτελεσμάτων.

Με την επιλογή -r αυτό θα συνεχιστεί μέχρι να πατήσετε Ctrl+C. Με τη μορφή +r, θα συνεχίσει έως ότου δεν υπάρχουν αποτελέσματα για εμφάνιση ή μέχρι να πατήσετε Ctrl+C.

sudo lsof -u mary -c ssh -a -r5

Σημειώστε τη διακεκομμένη γραμμή στο κάτω μέρος της καταχώρισης. Αυτό διαχωρίζει κάθε νέα εμφάνιση δεδομένων όταν ανανεώνεται η έξοδος.

Εμφάνιση αρχείων που σχετίζονται με συνδέσεις στο Διαδίκτυο

Η επιλογή -i (internet) σάς επιτρέπει να βλέπετε τα αρχεία που ανοίγονται από διαδικασίες που σχετίζονται με συνδέσεις δικτύου και Διαδικτύου.

lsof -i

Εμφανίζονται όλα τα αρχεία που ανοίγονται από συνδέσεις δικτύου και Διαδικτύου.

Εμφάνιση αρχείων που σχετίζονται με συνδέσεις στο Διαδίκτυο κατά αναγνωριστικό διαδικασίας

Για να δείτε τα αρχεία που ανοίγονται από συνδέσεις Διαδικτύου που σχετίζονται με ένα συγκεκριμένο αναγνωριστικό διεργασίας, προσθέστε την επιλογή -p και την επιλογή -a.

Εδώ αναζητούμε αρχεία που έχουν ανοίξει μέσω σύνδεσης στο διαδίκτυο ή δικτύου, με μια διαδικασία με αναγνωριστικό 606.

sudo lsof -i -a -p 606

Εμφανίζονται όλα τα αρχεία που ανοίγονται με το ID 606 της διαδικασίας και σχετίζονται με συνδέσεις στο Διαδίκτυο ή στο δίκτυο.

Εμφάνιση αρχείων που σχετίζονται με συνδέσεις και εντολές στο Διαδίκτυο

Μπορούμε να χρησιμοποιήσουμε την επιλογή -c (εντολή) για να αναζητήσουμε αρχεία που ανοίγονται από συγκεκριμένες διεργασίες. Για να αναζητήσετε αρχεία που έχουν ανοιχτεί από συνδέσεις Διαδικτύου ή δικτύου που σχετίζονται με τη διαδικασία ssh, χρησιμοποιήστε την ακόλουθη εντολή:

lsof -i -a -c ssh

Όλα τα αρχεία που ανοίγουν λόγω των διαδικασιών ssh παρατίθενται στην έξοδο.

Εμφάνιση αρχείων που σχετίζονται με συνδέσεις και θύρες στο Διαδίκτυο

Μπορούμε να κάνουμε lsof αναφορά για τα αρχεία που άνοιξαν μέσω Διαδικτύου ή συνδέσεων δικτύου σε μια συγκεκριμένη θύρα. Για να το κάνουμε αυτό, χρησιμοποιούμε τον χαρακτήρα : ακολουθούμενο από τον αριθμό θύρας.

Εδώ ζητάμε από τον lsof να παραθέσει τα αρχεία που έχουν ανοίξει από συνδέσεις δικτύου ή Διαδικτύου χρησιμοποιώντας τη θύρα 22.

lsof -i :22

Όλα τα αρχεία που παρατίθενται άνοιξαν από διεργασίες που σχετίζονται με τη θύρα 22 (η οποία είναι η προεπιλεγμένη θύρα για συνδέσεις SSH).

Εμφάνιση αρχείων που σχετίζονται με συνδέσεις και πρωτόκολλα στο Διαδίκτυο

Μπορούμε να ζητήσουμε από το lsof να εμφανίσει τα αρχεία που έχουν ανοιχτεί από διεργασίες που σχετίζονται με συνδέσεις δικτύου και Διαδικτύου, που χρησιμοποιούν ένα συγκεκριμένο πρωτόκολλο. Μπορούμε να επιλέξουμε από TCP, UDP και SMTP. Ας χρησιμοποιήσουμε το πρωτόκολλο TCP και ας δούμε τι παίρνουμε.

sudo lsof -i tcp

Τα μόνα αρχεία που παρατίθενται είναι αυτά που ανοίγουν από διεργασίες που χρησιμοποιούν το πρωτόκολλο TCP.

Έχουμε γρατσουνίσει μόνο την επιφάνεια

Αυτό είναι μια καλή βάση σε ορισμένες περιπτώσεις κοινής χρήσης για το lsof, αλλά υπάρχουν πολλά περισσότερα από αυτό. Πόσο περισσότερο μπορεί να κριθεί από το γεγονός ότι η σελίδα man έχει πάνω από 2.800 γραμμές.

Η εντολή lsof μπορεί να χρησιμοποιηθεί για να διεισδύσει όλο και πιο βαθιά στα στρώματα των ανοιχτών αρχείων και των ψευδο-αρχείων. Έχουμε παράσχει ένα σκίτσο χάρτη. ο άτλαντας είναι μέσα η σελίδα του ανθρώπου.