Jak znaleźć i usunąć uszkodzone linki symboliczne w systemie Linux

Dowiązania symboliczne w systemie Linux to fantastyczna funkcja, ale mogą zostać zerwane i pozostawione na nic. Oto jak zlokalizować uszkodzone dowiązania symboliczne, przejrzeć je i usunąć z systemu, jeśli zajdzie taka potrzeba.

Powiązania symboliczne 101

Dowiązania symboliczne, nazywane także „miękkimi linkami” i „dowiązaniami symbolicznymi”, to forma skrótów, które mogą wskazywać pliki i katalogi. Dowiązanie symboliczne wygląda jak zwykły plik lub katalog w oknie menedżera plików. Pojawia się również jako wpis w liście plików w oknie terminala. Plik lub katalog, na który wskazuje dowiązanie symboliczne, może znajdować się w dowolnym miejscu drzewa systemu plików.

Na przykład, powiedzmy, że masz w swoim katalogu domowym dowiązanie symboliczne o nazwie „dave-link”, które wskazuje na plik o nazwie „plik-tekstowy.txt” znajdujący się w innym miejscu w drzewie systemu plików. Polecenia używane na dowiązaniu symbolicznym są automatycznie stosowane do pliku, na który wskazuje. Jeśli spróbujesz użyć cat lub less w dowiązaniu symbolicznym, w rzeczywistości zobaczysz zawartość pliku „text-file.txt”.

Standardowa instalacja Linuksa zawiera wiele dowiązań symbolicznych. Nawet jeśli sam ich nie utworzysz, system operacyjny ich używa. Procedury instalacyjne aplikacji często używają dowiązań symbolicznych do wskazywania plików wykonywalnych. Kiedy oprogramowanie jest aktualizowane, plik binarny jest zastępowany nową wersją, a wszystkie dowiązania symboliczne działają jak poprzednio, o ile nazwa nowego pliku jest taka sama jak stary.

Możemy łatwo zobaczyć niektóre dowiązania symboliczne, używając ls w katalogu głównym. Niektóre wpisy są wyświetlane w innym kolorze – na naszej maszynie testowej Ubuntu 20.10 są wyświetlane w kolorze jasnoniebieskim.

Wpisujemy:

ls /

ls / w oknie terminala.

Możemy przyjrzeć się dokładniej, używając opcji -l (długa lista). Wpisujemy następujące polecenie, aby przejrzeć wszystkie wpisy „lib” i pojedynczy wpis „bin”:

ls -l /lib* /bin

ls -l / lib * / bin w oknie terminala.

Na początku każdej linii znajduje się „l”, co oznacza, że ​​element jest dowiązaniem symbolicznym. Tekst po „->” pokazuje, na co wskazuje łącze symboliczne. W naszym przykładzie celem są wszystkie katalogi.

Uprawnienia są wymienione jako odczyt, zapis i wykonywanie dla właściciela, grupy i innych osób. To są domyślne fałszywe wpisy. Nie odzwierciedlają rzeczywistych uprawnień do obiektów, na które wskazują łącza symboliczne. To uprawnienia do docelowego pliku lub katalogu mają pierwszeństwo i są honorowane przez system plików.

Uszkodzone łącza symboliczne

Dowiązanie symboliczne jest zepsute (lub wiszące), gdy plik, na który wskazuje, jest usuwany lub przenoszony do innej lokalizacji. Jeśli procedura dezinstalacji aplikacji nie działa poprawnie lub zostanie przerwana przed zakończeniem, możesz pozostać z uszkodzonymi dowiązaniami symbolicznymi.

Jeśli ktoś ręcznie usunie plik, nie wiedząc, że wskazują na niego łącza symboliczne, te łącza symboliczne przestaną działać. Będą jak znaki drogowe wskazujące na zburzone miasto.

Możemy łatwo zobaczyć to zachowanie, używając dowiązania symbolicznego o nazwie „hello” w bieżącym katalogu. Wpisujemy następujące, używając ls, aby to zobaczyć:

ls -l

Wskazuje na program o nazwie „htg” w katalogu o nazwie „bin”. Jeśli „uruchomimy” dowiązanie symboliczne, wykona on za nas program:

./hello

Możemy teraz sprawdzić, czy tak się dzieje, uruchamiając program bezpośrednio:

../bin/htg

Zgodnie z oczekiwaniami otrzymujemy tę samą odpowiedź. Usuńmy plik programu:

rm ../bin/htg

Teraz, kiedy patrzymy na łącze symboliczne, widzimy, że jest ono wymienione na czerwono, ponieważ Linux wie, że jest uszkodzony. Informuje również o tym, co wskazywało, więc możemy zastąpić plik, ponownie skompilować program lub zrobić wszystko, co konieczne, aby naprawić dowiązanie symboliczne.

Zauważ, że jeśli spróbujemy uruchomić dowiązanie symboliczne, otrzymany błąd odwołuje się do nazwy dowiązania symbolicznego, a nie do nazwy programu, na który wskazuje dowiązanie symboliczne.

Wpisujemy:

./hello

ls -l w oknie terminala.

Znajdowanie uszkodzonych łączy symbolicznych

Większość nowoczesnych wersji find ma opcję xtype (typ rozszerzony), co upraszcza znajdowanie uszkodzonych dowiązań symbolicznych. Użyjemy flagi l z xtype, aby powiedzieć mu, aby szukał linków. Użycie funkcji find i xtype w następujący sposób, bez żadnych innych flag typu, zmusza xtype do zwracania uszkodzonych linków:

find . -xtype l

znajdź -xtype l w oknie terminala.

Uruchomienie polecenia w naszym katalogu domowym testów powoduje znalezienie kilku zepsutych dowiązań symbolicznych. Zauważ, że wyszukiwanie jest domyślnie cykliczne, więc automatycznie przeszukuje wszystkie podkatalogi.

Zgodnie z oczekiwaniami wymieniono łącze symboliczne „cześć”, które celowo zerwaliśmy. Jedno z pozostałych łączy symbolicznych jest powiązane z przeglądarką Firefox, a pozostałe są powiązane z przyciąganiem.

Jeśli wyprowadzimy wyjście przez wc z opcją -l (linie), możemy policzyć linie, co jest tym samym, co zliczanie przerwanych dowiązań symbolicznych.

Wpisujemy:

find . -xtype l | wc -l

odnaleźć .  -xtype l |  wc -l w oknie terminala.

Poinformowano nas, że mamy 24 uszkodzone linki symboliczne, które nic nie wskazują.

Znajdź, przejrzyj, a następnie Usuń

Zanim w pośpiechu usuniesz wszystkie uszkodzone łącza symboliczne, przejrzyj wyniki polecenia znajdź. Sprawdź, czy istnieje ważny powód dla któregokolwiek z uszkodzonych linków symbolicznych.

Czasami problemem może być łącze symboliczne, a nie plik docelowy. Jeśli łącze symboliczne zostało utworzone nieprawidłowo, może nic nie wskazywać, ale obecny jest rzeczywisty cel. W takim przypadku poprawką byłoby ponowne utworzenie łącza symbolicznego.

Możliwe jest również, że pozornie uszkodzone łącze symboliczne jest używane jako coś innego, na przykład wskaźnik blokady pliku lub inny wskaźnik przejścia / nie przejścia. Firefox to robi; to jest pierwsze dowiązanie symboliczne na naszej liście. Firefox nie jest jednak używany na naszej maszynie testowej, więc możemy go bezpiecznie usunąć.

Możliwe jest również, że cel jest obecny tylko okresowo i jest to oczekiwane (i pożądane) zachowanie tego konkretnego oprogramowania. Być może plik docelowy jest kopiowany z innej maszyny lub chmury, spełnia swoją funkcję, a następnie jest ponownie usuwany, aby w następnym cyklu zostać zastąpiony innym programem.

Uszkodzone łącze symboliczne może być również objawem niepowodzenia instalacji oprogramowania. W takim przypadku, zamiast usuwać dowiązanie symboliczne, powinieneś albo naprawić go ręcznie, albo powtórzyć instalację.

Po naprawieniu zepsutych linków, które musisz zachować, powtórz polecenie, aby przeprowadzić wyszukiwanie. W wynikach wyszukiwania powinny być wtedy nieobecne stałe łącza symboliczne.

Ze względów bezpieczeństwa najlepiej jest ograniczyć usuwanie linków symbolicznych do własnych katalogów. Zachowaj szczególną ostrożność podczas uruchamiania tych poleceń jako root lub w katalogach systemowych.

Usuwanie uszkodzonych linków symbolicznych

Opcja -exec (wykonaj) uruchamia polecenia w wynikach wyszukiwania find. Zamierzamy użyć rm, aby usunąć każde zepsute łącze symboliczne. Ciąg {} jest zastępowany nazwą każdego uszkodzonego łącza symbolicznego, gdy każde z nich jest odkrywane przez find.

Musimy użyć średnika (;), aby zakończyć listę poleceń, które chcemy uruchomić -exec. Użyjemy odwrotnego ukośnika (), aby „uciec” przed średnikiem, więc jest on traktowany jako część polecenia wyszukiwania, a nie coś, na czym Bash powinien działać.

Wpisujemy:

find . -xtype l -exec rm {} ;

odnaleźć .  -xtype l -exec rm {};  w oknie terminala.

Wróciliśmy do wiersza poleceń bez wskazania, że ​​coś się stało. Aby sprawdzić, czy uszkodzone linki zostały usunięte, powtarzamy polecenie ich wyszukania w następujący sposób:

find . -xtype l

odnaleźć .  -xtype l w oknie terminala.

Brak pasujących wyników, co oznacza, że ​​uszkodzone linki symboliczne zostały usunięte.

Pamiętaj, aby najpierw przejrzeć

Ponownie, zawsze poświęć trochę czasu na przejrzenie listy linków symbolicznych przed uruchomieniem polecenia, aby je usunąć. Możesz uniknąć usuwania wszelkich, co do których nie jesteś pewien, uruchamiając polecenie, aby usunąć je w odpowiednich katalogach.

Na przykład powyżej, moglibyśmy uruchomić polecenie w katalogu „.snap”, a następnie ręcznie usunąć pojedyncze dowiązanie symboliczne „hello”. To pozostawiłoby nietknięte łącze symboliczne blokady przeglądarki Firefox.