Πώς να βρείτε και να διαγράψετε κατεστραμμένους συμβολικούς συνδέσμους στο Linux

Οι συμβολικοί σύνδεσμοι στο Linux είναι ένα φανταστικό χαρακτηριστικό, αλλά μπορεί να σπάσουν και να μην δείχνουν τίποτα. Δείτε πώς μπορείτε να εντοπίσετε κατεστραμμένους συμβολικούς συνδέσμους, να τους ελέγξετε και να τους αφαιρέσετε από το σύστημά σας εάν χρειάζεται.

Συμβολικοί σύνδεσμοι 101

Οι συμβολικοί σύνδεσμοι, που ονομάζονται επίσης “soft links” και “symlinks”, είναι μια μορφή συντομεύσεων που μπορούν να παραπέμπουν σε αρχεία και καταλόγους. Ένας συμβολικός σύνδεσμος μοιάζει ακριβώς με ένα κανονικό αρχείο ή κατάλογο σε ένα παράθυρο διαχείρισης αρχείων. Εμφανίζεται επίσης ως καταχώρηση σε μια λίστα αρχείων σε ένα παράθυρο τερματικού. Το αρχείο ή ο κατάλογος στον οποίο οδηγεί ο συμβολικός σύνδεσμος μπορεί να βρίσκεται οπουδήποτε στο δέντρο του συστήματος αρχείων.

Για παράδειγμα, ας υποθέσουμε ότι έχετε έναν συμβολικό σύνδεσμο στον αρχικό σας κατάλογο που ονομάζεται “dave-link” που οδηγεί σε ένα αρχείο που ονομάζεται “text-file.txt” που βρίσκεται κάπου αλλού στο δέντρο του συστήματος αρχείων. Οι εντολές που χρησιμοποιείτε στον συμβολικό σύνδεσμο εφαρμόζονται αυτόματα στο αρχείο στο οποίο οδηγεί. Αν προσπαθήσετε να χρησιμοποιήσετε το cat ή λιγότερο στον συμβολικό σύνδεσμο, θα δείτε πραγματικά τα περιεχόμενα του αρχείου “text-file.txt”.

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

Μπορούμε εύκολα να δούμε ορισμένους συμβολικούς συνδέσμους χρησιμοποιώντας ls στον ριζικό κατάλογο. Ορισμένες από τις καταχωρήσεις εμφανίζονται με διαφορετικό χρώμα—στο μηχάνημα δοκιμής Ubuntu 20.10, εμφανίζονται με ανοιχτό μπλε χρώμα.

Πληκτρολογούμε τα εξής:

ls /

Μπορούμε να ρίξουμε μια πιο βαθιά ματιά χρησιμοποιώντας την επιλογή -l (μεγάλη λίστα). Πληκτρολογούμε την ακόλουθη εντολή για να δούμε όλες τις καταχωρήσεις “lib” και τη μοναδική καταχώρηση “bin”:

ls -l /lib* /bin

Στην αρχή κάθε γραμμής υπάρχει ένα “l”, το οποίο υποδεικνύει ότι το στοιχείο είναι ένας συμβολικός σύνδεσμος. Το κείμενο μετά το “->” δείχνει σε τι δείχνει ο συμβολικός σύνδεσμος. Στο παράδειγμά μας, οι στόχοι είναι όλοι κατάλογοι.

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

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

Σπασμένοι συμβολικοί σύνδεσμοι

Ένας συμβολικός σύνδεσμος σπάει (ή αφήνεται να κρέμεται) όταν το αρχείο στο οποίο δείχνει διαγράφεται ή μετακινείται σε άλλη θέση. Εάν η ρουτίνα απεγκατάστασης μιας εφαρμογής δεν λειτουργεί σωστά ή διακόπτεται πριν ολοκληρωθεί, μπορεί να μείνετε με κατεστραμμένους συμβολικούς συνδέσμους.

Εάν κάποιος διαγράψει με μη αυτόματο τρόπο ένα αρχείο χωρίς να γνωρίζει ότι οι συμβολικοί σύνδεσμοι παραπέμπουν σε αυτό, αυτοί οι συμβολικοί σύνδεσμοι δεν θα λειτουργούν πλέον. Θα είναι σαν οδικές πινακίδες που δείχνουν προς μια πόλη που έχει καταστραφεί με μπουλντόζες.

Μπορούμε εύκολα να δούμε αυτήν τη συμπεριφορά χρησιμοποιώντας έναν συμβολικό σύνδεσμο που ονομάζεται “hello” στον τρέχοντα κατάλογο. Πληκτρολογούμε τα εξής, χρησιμοποιώντας ls για να το δούμε:

ls -l

Δείχνει ένα πρόγραμμα που ονομάζεται “htg” σε έναν κατάλογο που ονομάζεται “bin”. Αν «τρέξουμε» τον συμβολικό σύνδεσμο, εκτελεί το πρόγραμμα για εμάς:

./hello

Μπορούμε τώρα να ελέγξουμε αν αυτό συμβαίνει εκτελώντας απευθείας το πρόγραμμα:

../bin/htg

Όπως ήταν αναμενόμενο, έχουμε την ίδια απάντηση. Ας διαγράψουμε το αρχείο του προγράμματος:

rm ../bin/htg

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

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

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

Πληκτρολογούμε τα εξής:

./hello

Εύρεση κατεστραμμένων συμβολικών συνδέσμων

Οι περισσότερες σύγχρονες εκδόσεις του find έχουν την επιλογή xtype (εκτεταμένος τύπος), που απλοποιεί την εύρεση σπασμένων συμβολικών συνδέσμων. Θα χρησιμοποιήσουμε τη σημαία l με το xtype, για να του πούμε να αναζητήσει συνδέσμους. Χρησιμοποιώντας το find και το xtype ως εξής, χωρίς καμία από τις άλλες σημαίες τύπου, αναγκάζει το xtype να επιστρέψει κατεστραμμένους συνδέσμους:

find . -xtype l

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

Ο συμβολικός σύνδεσμος “γεια” που σπάσαμε επίτηδες παρατίθεται, όπως περιμέναμε. Ένας από τους άλλους συμβολικούς συνδέσμους σχετίζεται με το πρόγραμμα περιήγησης Firefox και οι υπόλοιποι σχετίζονται με snaps.

Αν διοχετεύσουμε την έξοδο μέσω του wc με την επιλογή -l (γραμμές), μπορούμε να μετρήσουμε τις γραμμές, που είναι το ίδιο με την καταμέτρηση των σπασμένων συμβολικών συνδέσμων.

Πληκτρολογούμε τα εξής:

find . -xtype l | wc -l

Ενημερωνόμαστε ότι έχουμε 24 σπασμένους συμβολικούς συνδέσμους που δεν δείχνουν τίποτα.

Εύρεση, αναθεώρηση και, στη συνέχεια, Κατάργηση

Πριν βιαστείτε και διαγράψετε όλους τους κατεστραμμένους συμβολικούς συνδέσμους, δείτε τα αποτελέσματα της εντολής εύρεσης. Δείτε αν υπάρχει έγκυρος λόγος για κάποιον από τους κατεστραμμένους συμβολικούς συνδέσμους.

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

Είναι επίσης πιθανό ένας φαινομενικά κατεστραμμένος συμβολικός σύνδεσμος να χρησιμοποιείται ως κάτι άλλο, όπως ένδειξη κλειδώματος αρχείου ή άλλη ένδειξη go/no go. Ο Firefox το κάνει αυτό. αυτός είναι ο πρώτος συμβολικός σύνδεσμος στη λίστα μας. Ωστόσο, ο Firefox δεν χρησιμοποιείται στη δοκιμαστική μηχανή μας, επομένως είναι ασφαλές να το διαγράψουμε.

Είναι επίσης πιθανό ο στόχος να υπάρχει μόνο περιοδικά, και αυτή είναι η αναμενόμενη (και επιθυμητή) συμπεριφορά του συγκεκριμένου λογισμικού. Ίσως το αρχείο προορισμού έχει αντιγραφεί από άλλο μηχάνημα ή το σύννεφο, εκτελεί τη λειτουργία του και, στη συνέχεια, διαγράφεται ξανά, για να αντικατασταθεί από ένα διαφορετικό πρόγραμμα στον επόμενο κύκλο.

  Πώς να εγκαταστήσετε το Cockpit στο Linux

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

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

Για λόγους ασφαλείας, είναι καλύτερο να περιορίσετε τις αφαιρέσεις συμβολικών συνδέσμων στους δικούς σας καταλόγους. Να είστε εξαιρετικά προσεκτικοί με την εκτέλεση αυτών των εντολών ως root ή σε καταλόγους συστήματος.

Αφαίρεση κατεστραμμένων συμβολικών συνδέσμων

Η επιλογή -exec (execute) εκτελεί εντολές στα αποτελέσματα αναζήτησης εύρεσης. Θα χρησιμοποιήσουμε το rm για να διαγράψουμε κάθε κατεστραμμένο συμβολικό σύνδεσμο. Η συμβολοσειρά {} αντικαθίσταται με το όνομα κάθε κατεστραμμένου συμβολικού συνδέσμου καθώς ο καθένας ανακαλύπτεται από την εύρεση.

Πρέπει να χρησιμοποιήσουμε ένα ερωτηματικό (;) για να τερματίσουμε τη λίστα των εντολών που θέλουμε να εκτελεστεί το -exec. Θα χρησιμοποιήσουμε μια ανάστροφη κάθετο () για να «ξεφύγουμε» από το ερωτηματικό, επομένως αντιμετωπίζεται ως μέρος της εντολής εύρεσης, αντί για κάτι που θα έπρεπε να ενεργήσει ο Bash.

Πληκτρολογούμε τα εξής:

find . -xtype l -exec rm {} ;

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

find . -xtype l

Δεν υπάρχουν αποτελέσματα που να ταιριάζουν, πράγμα που σημαίνει ότι οι κατεστραμμένοι συμβολικοί σύνδεσμοι έχουν αφαιρεθεί.

Θυμηθείτε να κάνετε αναθεώρηση πρώτα

Και πάλι, αφιερώνετε πάντα χρόνο για να ελέγξετε μια λίστα συμβόλων προτού εκτελέσετε την εντολή διαγραφής τους. Μπορείτε να αποφύγετε τη διαγραφή όσων δεν είστε σίγουροι εκτελώντας την εντολή για να τα διαγράψετε στους κατάλληλους καταλόγους.

Για παράδειγμα, παραπάνω, θα μπορούσαμε να είχαμε εκτελέσει την εντολή στον κατάλογο “.snap” και, στη συνέχεια, να αφαιρέσαμε με μη αυτόματο τρόπο τον μοναχικό σύμβολο “γεια”. Αυτό θα είχε αφήσει ανέγγιχτο τον συμβολικό σύνδεσμο κλειδώματος του Firefox.