Как эффективно отслеживать жесткие ссылки в Linux?

Если вы хотите увидеть:(последнюю часть вашего текущего каталога ), за которой следует знак решетки, вы должны использовать:

PS1='\W# '

Поместите эту строку в файл .bashrcв вашем домашнем каталоге.

Хотя я бы предостерег вас от использования #в командной строке, отличной от -, так как принято использовать что-то вроде >или $в строках приглашения, отличной от -, и #в корневой подсказке. быстрый.

Ссылка:Запрос оболочки Bash

7
10.09.2020, 00:38
1 ответ

how do I trace the original file or every hardlink using /usr/bin/bash file as reference

С помощью GNU найдите (или любую другую версию find, которая имеет параметр -samefile), и если предположить, что /usr/bin/bashнаходится в файловой системе /, это правильно:

find / -xdev -samefile /bin/bash

Используйте -xdev, так как жесткие ссылки не могут пересекать границы файловой системы. Не перенаправлять ошибки :, если у вас нет разрешения на просмотр каталога, в этом каталоге может присутствовать жесткая ссылка, и вы ее пропустите.

Ошибка, которую вы совершаете, заключается в том, что вы ищете другую жесткую ссылку, которой не существует. На самом деле у вас есть информация, чтобы знать, что его не существует:

1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /bin/bash*
                   ^

Количество жестких ссылок /bin/bashравно 1.

В /есть один файл, который совпадает с /usr/bin/bash. Файл /bin/bashсовпадает с /usr/bin/bashпо другой причине :каталоги /binи /usr/binявляются одним и тем же файлом. Поскольку find / -samefile /bin/bashуказывает на /usr/bin/bash, /binимеет символическую ссылку на /usr/bin. Точнее, из информации в вопросе и предполагая, что /binне является жесткой ссылкой на каталог (плохо поддерживаемой, редко используемой функцией ), мы знаем, что /bin— это символическая ссылка, которая разрешается в /usr/bin; это может быть символическая ссылка на другую символическую ссылку и т. д., в конечном итоге приводящая к /usr/binили к некоторому эквивалентному пути, такому как ///////usr/bin/,но, скорее всего, это символическая ссылка, целью которой является /usr/bin.

Искать все символические ссылки на файл во всей системе не особенно продуктивно. Например, в Linux есть файл /proc/*/exe, который является символической ссылкой на/usr/bin/bash(или/bin/bash)для каждого процесса, выполняющего bash. И если вы ищете символические ссылки на каталог, вы окажетесь внутри бесконечной рекурсии, например, с /proc/*/root, указывающим на /(, за исключением процессов с chroot ).

Если вам нужно узнать, указывают ли два пути на один и тот же файл, в Linux вы можете использовать любой из

[ /bin/bash -ef /usr/bin/bash ]
test /bin/bash -ef /usr/bin/bash

(-efне POSIX, но он есть в dash, bash, BusyBox и GNU coreutils ). Если вам нужно получить канонический путь к файлу в том смысле, что разные файлы всегда имеют разные канонические имена, вы можете использовать

readlink -f /bin/bash

(Это может привести к пропуску файлов, которые совпадают через смонтированные каталоги, например, если одно и то же сетевое расположение смонтировано двумя разными способами.)

24
18.03.2021, 23:07

Теги

Похожие вопросы