найти отказ в разрешении при удалении временного файла определенного пользователя

Если все, что вам нужно, это просто листинг, я бы выбрал старый добрый grepвместо вывода find. Это было бы медленнее, но гораздо меньше печатать.

В самом простом случае вы можете попробовать это для вашего примера:

find -printf '%u %p\n' | egrep '^br_'

Это дает вам список файлов, принадлежащих пользователям br_*, показанный с именем пользователя и именем файла в каждой строке.

Затем вы можете расширить вывод, изменив -printfстроку формата  .

Например, чтобы он больше походил на lsвывод:

find -printf '%-8.8u %-8.8g %M %8s %t %p\n' | egrep '^br_'

Чтобы сделать командную строку максимально короткой, важно поместить имя пользователя в самое начало, чтобы часть egrepможно было сделать такой короткой.

Чтобы увидеть все, что можно указать в строке формата, перейдите сюда , затем найдите -printf format.

Будьте осторожны, если ваши файлы содержат символы новой строки в именах, это решение может иметь проблемы с их отображением.

0
26.05.2020, 02:42
2 ответа

Во избежание сообщений об ошибках

find /tmp -type f -user $USER -exec rm -f {} \;

вы можете либо перенаправить их

find /tmp -type f -user $USER -exec rm -f {} \; 2>/dev/null

или предотвратить findстолкновение с этой проблемой:

find /tmp \( -type d \( -executable -o -prune \) \) -o -type f -user $USER -exec rm -f {} \;
0
18.03.2021, 23:33

С помощью find /tmp -type f -user $USER -exec rm -f {} \;вы говорите findнайти и удалить все файлы, принадлежащие $USERв везде под/tmp.

Теперь ваш /tmpсодержит подкаталоги -, принадлежащие пользователю root. Теоретически они могут содержать больше файлов, принадлежащих $USER. Итак, findпопытается заглянуть в эти каталоги, чтобы найти их. Но каталоги, принадлежащие root -, имеют разрешения drwx------, поэтому только root сможет получить к ним доступ каким-либо образом.

В результате findсообщит о каталогах, в которые ему не удалось войти, чтобы сообщить вам, что он не может искать везде под /tmpи поэтому теоретически может что-то пропустить.

Сценарии, которые запускаются при запуске системы, будут выполняться от имени пользователя root, если не указано иное, поэтому, если вы запустите ту же команду в сценарии запуска системы -, он будет иметь полный доступ ко всем каталогам в /tmpи будет вообще не иметь этой проблемы :find, работающий от имени root, сможет выполнить исчерпывающий поиск во всех каталогах под /tmp.

Но если вы запустите его как свою собственную учетную запись пользователя, вам придется либо игнорировать ошибки «Отказано в доступе», поскольку вы их ожидаете, либо выполнить более сложный поиск, который сначала ищет каталоги $USER, к которым можно получить доступ в /tmp, а затем удаляет из них все файлы.

Или, если вы ищете только временные файлы, созданные одним и тем же скриптом,тогда вы захотите просмотреть временные файлы в каталоге /tmpтолько и игнорировать любые подкаталоги -каталога /tmp. Если вы хотите сделать это, погуглите, как использовать опцию -pruneдля find; это немного сложно.

Команда trapнемного отличается. Его можно использовать, чтобы гарантировать, что ваш скрипт всегда будет очищать свои временные файлы (, если только он не будет уничтожен неперехватываемым сигналом, таким как SIGKILLили системным сбоем ). В совместимой с POSIX -оболочке вы должны использовать ее следующим образом:

TMPFILE=$(mktemp)|| exit 1
trap "rm -f $TMPFILE" EXIT

В этой команде trapEXIT— это не команда, а условие, которое вызовет срабатывание ловушки. Условием может быть сигнал или специальное значение 0или EXIT. Оба этих специальных значения будут означать, что «это действие ловушки должно выполняться всякий раз, когда этот процесс оболочки по какой-либо причине завершается».

2
18.03.2021, 23:33

Теги

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