03/29/2024

Cum să găsiți și să ștergeți linkurile simbolice sparte pe Linux

Legăturile simbolice de pe Linux sunt o caracteristică fantastică, dar pot deveni rupte și lăsate îndreptate spre nimic. Iată cum să localizați legăturile simbolice întrerupte, să le examinați și să le eliminați din sistem dacă este necesar.

Legături simbolice 101

Legăturile simbolice, numite și „legături soft” și „legături simbolice”, sunt o formă de comenzi rapide care pot indica fișiere și directoare. Un link simbolic arată exact ca un fișier sau director obișnuit într-o fereastră de gestionare de fișiere. De asemenea, apare ca o intrare într-o listă de fișiere într-o fereastră de terminal. Fișierul sau directorul către care indică legătura simbolică poate fi oriunde în arborele sistemului de fișiere.

De exemplu, să presupunem că aveți un link simbolic în directorul dvs. principal numit „dave-link” care indică un fișier numit „text-file.txt” situat în altă parte în arborele sistemului de fișiere. Comenzile pe care le utilizați pe link-ul simbolic sunt aplicate automat fișierului către care indică. Dacă încercați să utilizați cat sau mai puțin pe linkul simbolic, veți vedea de fapt conținutul fișierului „text-file.txt”.

O instalare standard Linux conține multe legături simbolice. Chiar dacă nu creați singur niciunul, sistemul de operare le folosește. Rutinele de instalare a aplicațiilor folosesc adesea legături simbolice pentru a indica fișiere executabile. Când software-ul este actualizat, fișierul binar este înlocuit cu noua versiune și toate legăturile simbolice continuă să funcționeze ca înainte, atâta timp cât numele noului fișier este același cu cel vechi.

Putem vedea cu ușurință unele legături simbolice folosind ls în directorul rădăcină. Unele dintre intrările sunt afișate într-o culoare diferită – pe mașina noastră de testare Ubuntu 20.10, sunt afișate în albastru deschis.

Introducem următoarele:

ls /

Putem arunca o privire mai profundă utilizând opțiunea -l (lista lungă). Introducem următoarea comandă pentru a vedea toate intrările „lib” și singura intrare „bin”:

ls -l /lib* /bin

La începutul fiecărei linii este un „l”, ceea ce indică că elementul este o legătură simbolică. Textul de după „->” arată spre ce indică legătura simbolică. În exemplul nostru, țintele sunt toate directoarele.

  Cum să joci jocuri Atari pe Linux

Permisiunile sunt listate ca citire, scriere și execuție pentru proprietar, grup și alții. Acestea sunt intrări false implicite. Ele nu reflectă permisiunile reale asupra obiectelor către care indică legăturile simbolice. Permisiunile pentru fișierul sau directorul țintă au prioritate și sunt onorate de sistemul de fișiere.

Legături simbolice sparte

O legătură simbolică este întreruptă (sau lăsată atârnând) atunci când fișierul către care indică este șters sau mutat în altă locație. Dacă rutina de dezinstalare a unei aplicații nu funcționează corect sau este întreruptă înainte de finalizare, este posibil să rămâneți cu legături simbolice rupte.

Dacă cineva șterge manual un fișier fără să știe că linkurile simbolice indică către el, acele linkuri simbolice nu vor mai funcționa. Vor fi ca semnele rutiere care indică spre un oraș care a fost buldozat.

Putem vedea cu ușurință acest comportament folosind un link simbolic numit „hello” în directorul curent. Introducem următoarele, folosind ls pentru a-l vedea:

ls -l

Indică un program numit „htg” într-un director numit „bin”. Dacă „rulăm” linkul simbolic, acesta execută programul pentru noi:

./hello

Acum putem verifica dacă acest lucru se întâmplă prin rularea directă a programului:

../bin/htg

După cum era de așteptat, primim același răspuns. Să ștergem fișierul programului:

rm ../bin/htg

Acum, când ne uităm la link-ul simbolic, vedem că este listat cu roșu, deoarece Linux știe că este rupt. De asemenea, ne spune la ce a indicat înainte, astfel încât să putem înlocui fișierul, recompila programul sau să facem tot ce este necesar pentru a repara legătura simbolică.

Rețineți că, dacă încercăm să rulăm linkul simbolic, eroarea pe care o primim se referă la numele linkului simbolic, mai degrabă decât numele programului către care indică linkul simbolic.

Introducem următoarele:

./hello

Găsirea de legături simbolice sparte

Cele mai multe versiuni moderne de find au opțiunea xtype (tip extins), ceea ce simplifică găsirea legăturilor simbolice rupte. Vom folosi indicatorul l cu xtype, pentru a-i spune să caute link-uri. Folosind find și xtype după cum urmează, fără niciunul dintre celelalte steaguri de tip, forțează xtype să returneze link-uri întrerupte:

find . -xtype l

Rularea comenzii în directorul nostru principal de testare găsește destul de multe legături simbolice rupte. Rețineți că căutarea este recursivă în mod implicit, așa că caută automat în toate subdirectoarele.

  Cum să faci Kanboard să funcționeze pe serverul tău Linux

Legătura simbolică „bună ziua” pe care am rupt-o intenționat este listată, așa cum ne așteptam. Unul dintre celelalte link-uri simbolice este legat de browserul Firefox, iar restul sunt asociate cu instantanee.

Dacă conductăm ieșirea prin wc cu opțiunea -l (linii), putem număra liniile, ceea ce este la fel cu numărarea legăturilor simbolice rupte.

Introducem următoarele:

find . -xtype l | wc -l

Suntem informați că avem 24 de link-uri simbolice rupte care nu indică nimic.

Găsiți, examinați și apoi Eliminați

Înainte să vă grăbiți și să ștergeți toate legăturile simbolice rupte, priviți rezultatele comenzii find. Vedeți dacă există un motiv valid pentru vreunul dintre linkurile simbolice rupte.

Uneori, legătura simbolică ar putea fi problema, mai degrabă decât fișierul țintă. Dacă legătura simbolică a fost creată incorect, s-ar putea să nu arate nimic, dar ținta reală este prezentă. Recrearea legăturii simbolice ar fi soluția în acest caz.

De asemenea, este posibil ca o legătură simbolică aparent întreruptă să fie folosită ca altceva, cum ar fi un indicator al blocării unui fișier sau un alt indicator de acces/nu merge. Firefox face asta; acesta este primul link simbolic din lista noastră. Totuși, Firefox nu este folosit pe mașina noastră de testare, așa că este sigur să îl ștergem.

De asemenea, este posibil ca ținta să fie prezentă doar periodic și acesta este comportamentul așteptat (și dorit) al respectivului software. Poate că fișierul țintă este copiat de pe o altă mașină sau din cloud, își îndeplinește funcția și apoi este șters din nou, doar pentru a fi înlocuit cu un alt program în următorul ciclu.

  Cum se instalează Linux pe un Chromebook cu Crouton

Legătura simbolică întreruptă poate fi, de asemenea, un simptom al instalării unui software care a eșuat. În acest caz, în loc să ștergeți linkul simbolic, ar trebui fie să îl remediați manual, fie să repetați instalarea.

După ce ați reparat legăturile rupte pe care trebuie să le păstrați, repetați comanda pentru a efectua căutarea. Linkurile simbolice fixe ar trebui apoi să lipsească din rezultatele căutării.

Din motive de siguranță, cel mai bine este să limitați eliminările de linkuri simbolice la propriile directoare. Fiți foarte atenți la rularea acestor comenzi ca root sau în directoarele de sistem.

Eliminarea legăturilor simbolice întrerupte

Opțiunea -exec (execute) rulează comenzi pe rezultatele căutării de căutare. Vom folosi rm pentru a șterge fiecare link simbolic rupt. Șirul {} este înlocuit cu numele fiecărei legături simbolice rupte pe măsură ce fiecare este descoperit de find.

Trebuie să folosim punct și virgulă (;) pentru a încheia lista de comenzi pe care dorim să le ruleze -exec. Vom folosi o bară oblică inversă () pentru a „scăpa” din punct și virgulă, deci este tratată ca parte a comenzii find, mai degrabă decât ceva asupra căruia Bash ar trebui să acționeze.

Introducem următoarele:

find . -xtype l -exec rm {} ;

Ne întoarcem la promptul de comandă fără nicio indicație că s-a întâmplat ceva. Pentru a verifica că linkurile întrerupte au fost eliminate, repetăm ​​comanda pentru a le căuta, după cum urmează:

find . -xtype l

Nu există rezultate care să se potrivească, ceea ce înseamnă că legăturile simbolice întrerupte au fost eliminate.

Nu uitați să revizuiți mai întâi

Din nou, faceți-vă întotdeauna timp pentru a examina o listă de legături simbolice înainte de a executa comanda pentru a le șterge. Puteți evita ștergerea celor despre care nu sunteți sigur, rulând comanda pentru a le șterge în directoarele corespunzătoare.

De exemplu, mai sus, am fi putut rula comanda în directorul „.snap” și apoi am fi eliminat manual linkul simbolic solitar „hello”. Acest lucru ar fi lăsat neatins linkul simbolic de blocare Firefox.