Как выразить тесты -writeable и -readable `find`, если они недоступны?

Он ищет /tools/bin/envв chrootокружении -, так что все, что $LFS/tools/bin/envбудет оцениваться как...

Если этот файл/каталог отсутствует -и из вашего комментария, где вы говорите, что он не найден, когда вы пытаетесь выполнить lsдля него, он отсутствует -, то вы пропустили шаг или не не замечаю провала. Вернитесь к документам LFS и найдите, где это было скомпилировано/установлено/связано/и т. д., и подтвердите, что вы действительно выполнили эти шаги.

1
01.06.2019, 21:41
1 ответ

Нет удобного способа. Вот почему GNU находит добавленных -readableи друзей.

Вы можете построить выражение, которое приблизительно соответствует проверке разрешений, перечислив группы, в которых состоит пользователь. Не проверено.

can_access="( -user $(id -u) -perm -0${oct}00 -o ("
for g in $(id -G); do
  can_access="$can_access -group $g -o"
done
can_access="${can_access% -o} ) -perm -00${oct}0 -o -perm -000${oct} )"
find … $can_access -print

В некоторых случаях это не дает правильного результата, например, при наличии списков управления доступом или в крайних случаях, таких как -rw----r--для отказа в доступе к группе. Вы можете проверить крайние случаи с помощью той же техники, что и выше, но выражение становится еще более сложным. Для списков контроля доступавам нужно вызвать инструмент, который их поддерживает.

Такие языки, как Perl и Python, обеспечивают легкий доступ как к функции access(2), так и к функциям find. В Perl сFile::Findи-r/ -w/ -x(, которые используют эффективный uid и gid процесса Perl — используйте -R/ -W/ -Xдля проверки с реальным uid/ gid, например access(2), и используйте прагмуfiletest 'access', если ваш Perl не слишком древний для поддержки таких вещей, как ACL):

use File::Find;
use filetest 'access';
find(sub { if (-r $_) { print "$_ is readable\n"; } }, '.');

В Python сos.walkи os.access(, которые используют настоящие uid и gid процесса Python, напримерaccess(2)):

import os
for dirpath, dirnames, filenames in os.walk('.', ):
    for filename in filenames:
        filename = os.path.join(dirpath, filenames)
        if os.access(filename, os.R_OK):
            print(filename + ' is readable\n')

Единственный полностью надежный способ — попытаться открыть файл. Для этого требуется внешняя утилита, так что это будет медленнее. Для проверки читабельности обычного файла:

find … -exec sh -c 'exec 2>/dev/null; : <"$0"' {} \; …

Чтобы проверить возможность записи, используйте: >>"$0"(это открывает файл для добавления, поэтому если файл недоступен для записи, он не будет работать, но на самом деле он ничего не изменяет и, в частности, не будет обновлять модификацию. время ). Чтобы проверить каталог на удобочитаемость, используйте ls -- "$0" >/dev/null. Чтобы проверить исполняемость каталога, используйте cd -- "$0". Не существует пассивного теста на исполняемость обычного файла, возможность записи каталога или доступ к большинству не -обычных файлов.

1
27.01.2020, 23:41

Теги

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