Как да намерите и изтриете счупени символни връзки в Linux

Символичните връзки в Linux са фантастична функция, но могат да се счупят и да останат да сочат към нищо. Ето как да намерите неработещи символни връзки, да ги прегледате и да ги премахнете от системата си, ако е необходимо.

Символични връзки 101

Символичните връзки, наричани още „меки връзки“ и „символни връзки“, са форма на преки пътища, които могат да сочат към файлове и директории. Символна връзка изглежда точно като обикновен файл или директория в прозорец на файлов мениджър. Той също така се показва като запис в списък с файлове в прозорец на терминала. Файлът или директорията, към която сочи символната връзка, може да бъде навсякъде в дървото на файловата система.

Например, да приемем, че имате символна връзка във вашата домашна директория, наречена „dave-link“, която сочи към файл, наречен „text-file.txt“, разположен някъде другаде в дървото на файловата система. Командите, които използвате в символната връзка, се прилагат автоматично към файла, към който тя сочи. Ако се опитате да използвате cat или по-малко в символната връзка, всъщност ще видите съдържанието на файла “text-file.txt”.

Стандартната инсталация на Linux съдържа много символни връзки. Дори и да не създадете такива сами, операционната система ги използва. Процедурите за инсталиране на приложения често използват символни връзки, за да сочат към изпълними файлове. Когато софтуерът се актуализира, двоичният файл се заменя с новата версия и всички символни връзки продължават да работят както преди, стига името на новия файл да е същото като на стария.

Можем лесно да видим някои символни връзки, като използваме ls в основната директория. Някои от записите се показват в различен цвят — на нашата тестова машина Ubuntu 20.10 те се показват в светло синьо.

Пишем следното:

ls /

Можем да разгледаме по-задълбочено, като използваме опцията -l (дълъг списък). Набираме следната команда, за да разгледаме всички записи „lib“ и единичния запис „bin“:

ls -l /lib* /bin

В началото на всеки ред има „l“, което показва, че елементът е символна връзка. Текстът след “->” показва към какво сочи символната връзка. В нашия пример целите са всички директории.

  5-те най-добри падащи терминални приложения за Linux

Разрешенията са изброени като четене, запис и изпълнение за собственика, групата и други. Това са фалшиви записи по подразбиране. Те не отразяват действителните разрешения за обектите, към които сочат символичните връзки. Разрешенията за целевия файл или директория имат предимство и се зачитат от файловата система.

Счупени символни връзки

Символна връзка е счупена (или оставена висяща), когато файлът, към който сочи, е изтрит или преместен на друго място. Ако процедурата за деинсталиране на приложение не работи правилно или е прекъсната преди да завърши, може да останете с неработещи символни връзки.

Ако някой ръчно изтрие файл, без да знае, че символните връзки сочат към него, тези символни връзки вече няма да работят. Те ще бъдат като пътни знаци, сочещи град, който е бил съборен с булдозери.

Можем лесно да видим това поведение с помощта на символна връзка, наречена „здравей“ в текущата директория. Въведем следното, използвайки ls, за да го видим:

ls -l

Той сочи към програма, наречена „htg“ в директория, наречена „bin“. Ако „изпълним“ символната връзка, тя изпълнява програмата вместо нас:

./hello

Сега можем да проверим дали това се случва, като стартираме програмата директно:

../bin/htg

Както се очакваше, получаваме същия отговор. Нека изтрием програмния файл:

rm ../bin/htg

Сега, когато погледнем символната връзка, виждаме, че е посочена в червено, защото Linux знае, че е повредена. Той също така ни казва към какво е сочел, така че можем да заменим файла, да прекомпилираме програмата или да направим каквото е необходимо, за да поправим символната връзка.

Имайте предвид, че ако се опитаме да стартираме символната връзка, грешката, която получаваме, препраща към името на символната връзка, а не към името на програмата, към която сочи символната връзка.

  Как да интегрирате Thunderbird с Tor в Linux

Пишем следното:

./hello

Намиране на счупени символни връзки

Повечето съвременни версии на find имат опцията xtype (разширен тип), което опростява намирането на счупени символни връзки. Ще използваме флага l с xtype, за да му кажем да търси връзки. Използването на find и xtype, както следва, без други флагове за тип, принуждава xtype да връща неработещи връзки:

find . -xtype l

Изпълнението на командата в нашата тестова домашна директория открива доста счупени символни връзки. Имайте предвид, че търсенето е рекурсивно по подразбиране, така че автоматично търси всички поддиректории.

Символната връзка „здравей“, която счупихме нарочно, е посочена, както очаквахме. Една от другите символни връзки е свързана с браузъра Firefox, а останалите са свързани със снимки.

Ако преведем изхода през wc с опцията -l (линии), можем да преброим редовете, което е същото като преброяването на счупените символни връзки.

Пишем следното:

find . -xtype l | wc -l

Информирани сме, че имаме 24 счупени символни връзки, които не сочат към нищо.

Намерете, прегледайте и след това премахнете

Преди да се втурнете и да изтриете всички счупени символни връзки, прегледайте резултатите от командата find. Вижте дали има основателна причина за някоя от счупените символни връзки.

Понякога проблемът може да е символната връзка, а не целевият файл. Ако символната връзка е създадена неправилно, тя може да не сочи към нищо, но истинската цел е налице. Повторното създаване на символната връзка би било решението в този случай.

Възможно е също така видимо счупена символна връзка да се използва като нещо друго, като индикатор за заключване на файл или друг индикатор за излизане/неизлизане. Firefox прави това; това е първата символна връзка в нашия списък. Firefox обаче не се използва на нашата тестова машина, така че е безопасно да го изтрием.

Възможно е също така целта да присъства само периодично и това е очакваното (и желано) поведение на този конкретен софтуер. Може би целевият файл е копиран от друга машина или облака, той изпълнява своята функция и след това се изтрива отново, само за да бъде заменен от друга програма в следващия цикъл.

  Как да настроите удобен за деца компютър с Linux

Счупената символна връзка може също да е симптом на неуспешна инсталация на софтуер. В този случай, вместо да изтриете символната връзка, трябва или да я коригирате ръчно, или да повторите инсталацията.

Когато поправите повредените връзки, които трябва да запазите, повторете командата, за да извършите търсенето. След това фиксираните символни връзки трябва да отсъстват от резултатите от търсенето.

От съображения за безопасност е най-добре да ограничите премахването на символни връзки до вашите собствени директории. Бъдете изключително предпазливи при изпълнение на тези команди като root или в системни директории.

Премахване на счупени символни връзки

Опцията -exec (изпълнение) изпълнява команди върху резултатите от търсенето. Ще използваме rm, за да изтрием всяка повредена символна връзка. Низът {} се заменя с името на всяка неработеща символна връзка, тъй като всяка от тях се открива от find.

Трябва да използваме точка и запетая (;), за да прекратим списъка с команди, които искаме -exec да изпълнява. Ще използваме обратна наклонена черта (), за да „избягаме“ от точката и запетаята, така че тя се третира като част от командата find, а не като нещо, с което Bash трябва да действа.

Пишем следното:

find . -xtype l -exec rm {} ;

Връщаме се в командния ред без индикация, че нещо се е случило. За да проверим дали неработещите връзки са премахнати, повтаряме командата, за да ги потърсим, както следва:

find . -xtype l

Няма съвпадащи резултати, което означава, че прекъснатите символни връзки са премахнати.

Не забравяйте първо да прегледате

Отново винаги отделяйте време да прегледате списък със символни връзки, преди да изпълните командата, за да ги изтриете. Можете да избегнете изтриването на всички, за които не сте сигурни, като изпълните командата, за да ги изтриете в съответните директории.

Например, по-горе, можехме да изпълним командата в директорията „.snap“ и след това ръчно да премахнем самотната символна връзка „hello“. Това би оставило символната връзка за заключване на Firefox недокосната.