Як знайти та видалити зламані символічні посилання в 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», що вказує, що елемент є символічним посиланням. Текст після «->» показує, на що вказує символічне посилання. У нашому прикладі цілями є всі каталоги.

  Як грати в Counter-Strike: Global Offensive на Linux

У списку дозволів на читання, запис і виконання для власника, групи та інших. Це фальшиві записи за замовчуванням. Вони не відображають фактичних дозволів на об’єкти, на які вказують символічні посилання. Це дозволи на цільовий файл або каталог, які мають пріоритет і враховуються файловою системою.

Порушені символічні посилання

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

Якщо хтось вручну видаляє файл, не знаючи, що символічні посилання вказують на нього, ці символічні посилання більше не працюватимуть. Вони будуть як дорожні знаки, що вказують на місто, яке було зруйновано бульдозером.

Ми можемо легко побачити цю поведінку за допомогою символічного посилання під назвою «hello» у поточному каталозі. Ми вводимо наступне, використовуючи ls, щоб побачити його:

ls -l

Він вказує на програму під назвою «htg» у каталозі «bin». Якщо ми «запустимо» символічне посилання, воно виконає програму за нас:

./hello

Тепер ми можемо перевірити, чи це відбувається, запустивши програму безпосередньо:

../bin/htg

Як і очікувалося, ми отримуємо ту саму відповідь. Давайте видалимо програмний файл:

rm ../bin/htg

Тепер, коли ми дивимося на символічне посилання, ми бачимо, що воно позначене червоним кольором, тому що Linux знає, що воно зламане. Він також повідомляє нам, на що він вказував, щоб ми могли замінити файл, перекомпілювати програму або зробити все необхідне для відновлення символічного посилання.

Зауважте, що якщо ми спробуємо запустити символічне посилання, помилка, яку ми отримуємо, посилається на назву символічного посилання, а не на назву програми, на яку вказує символічне посилання.

  Як налаштувати Rsync на Linux

Набираємо наступне:

./hello

Пошук зламаних символічних посилань

Більшість сучасних версій find мають параметр xtype (розширений тип), що спрощує пошук зламаних символічних посилань. Ми будемо використовувати прапор l з xtype, щоб наказати йому шукати посилання. Використання find і xtype таким чином, без будь-яких інших прапорів типу, змушує xtype повертати непрацюючі посилання:

find . -xtype l

Виконання команди в нашому тестовому домашньому каталозі виявить чимало непрацюючих символічних посилань. Зауважте, що пошук за замовчуванням є рекурсивним, тому він шукає в усіх підкаталогах автоматично.

Як ми і очікували, символьне посилання «привіт», яке ми зламали навмисне, перелічено. Одне з інших символічних посилань пов’язане з браузером Firefox, а решта пов’язана з знімками.

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

Набираємо наступне:

find . -xtype l | wc -l

Нам повідомляють, що у нас є 24 непрацюючі символічні посилання, які ні на що не вказують.

Знайти, переглянути, а потім видалити

Перш ніж поспішати і видалити всі пошкоджені символічні посилання, перегляньте результати команди find. Перевірте, чи є поважна причина для будь-якого з непрацюючих символічних посилань.

Іноді проблемою може бути символічне посилання, а не цільовий файл. Якщо символічне посилання було створено неправильно, воно може вказувати ні на що, але справжня мета є. Повторне створення символічного посилання буде виправленням у цьому випадку.

Також можливо, що очевидно зламане символьне посилання використовується як щось інше, наприклад, індикатор блокування файлу або інший індикатор переходу/невиходу. Firefox робить це; це перше символьне посилання в нашому списку. Однак Firefox не використовується на нашій тестовій машині, тому ми безпечно його видаляємо.

Також можливо, що ціль присутня лише періодично, і це очікувана (і бажана) поведінка цього конкретного програмного забезпечення. Можливо, цільовий файл скопійовано з іншої машини або хмари, він виконує свою функцію, а потім знову видаляється, щоб у наступному циклі його замінити іншою програмою.

  Як очистити Wine від Linux

Непрацююче символьне посилання також може бути ознакою невдалої установки програмного забезпечення. У цьому випадку замість видалення символічного посилання вам слід виправити його вручну або повторити встановлення.

Коли ви виправите непрацюючі посилання, які потрібно зберегти, повторіть команду, щоб виконати пошук. Тоді фіксовані символічні посилання повинні бути відсутні в результатах пошуку.

З міркувань безпеки найкраще обмежити видалення символічних посилань вашими власними каталогами. Будьте дуже обережні, запускаючи ці команди як root або в системних каталогах.

Видалення зламаних символічних посилань

Параметр -exec (виконати) запускає команди для результатів пошуку. Ми збираємося використовувати rm для видалення кожного непрацюючого символічного посилання. Рядок {} замінюється назвою кожного непрацюючого символічного посилання, оскільки кожне з них виявляється за допомогою find.

Ми повинні використовувати крапку з комою (;), щоб завершити список команд, які ми хочемо запустити -exec. Ми будемо використовувати зворотну косу риску () для «виходу» крапки з комою, тому вона розглядається як частина команди пошуку, а не те, на що Bash має діяти.

Набираємо наступне:

find . -xtype l -exec rm {} ;

Ми повертаємося до командного рядка без жодних ознак того, що щось сталося. Щоб переконатися, що непрацездатні посилання видалено, ми повторюємо команду для їх пошуку, як показано нижче:

find . -xtype l

Немає жодних відповідних результатів, що означає, що непрацюючі символічні посилання видалено.

Не забудьте спочатку переглянути

Знову ж таки, завжди приділяйте час перегляду списку символічних посилань, перш ніж виконувати команду для їх видалення. Ви можете уникнути видалення будь-яких, у яких ви не впевнені, запустивши команду, щоб видалити їх у відповідних каталогах.

Наприклад, вище ми могли запустити команду в каталозі «.snap», а потім вручну видалити окреме символічне посилання «hello». Це лишило б символьне посилання блокування Firefox недоторканим.