Могу ли я использовать find для теста на возможность записи только для имени, которое я передал, без повторения? - PullRequest
0 голосов
/ 14 января 2019

У меня есть код ниже, который я просто пытаюсь распечатать разрешения домашних каталогов пользователей в файле /etc/passwd. Я также пытаюсь получить только те каталоги, которые имеют права на запись для группы и мира.

Я смог получить подробную информацию о домашних каталогах, но смог распечатать только все каталоги, которые есть в домашнем каталоге. Мне нужно только напечатать значения домашних каталогов, а не делать это рекурсивно.

for homdir in $(cat /etc/passwd | awk 'BEGIN{FS=":"}{print $6}'); do find $homdir -perm -o+w; done > /tmp/writeperimissions

Я ожидаю, что вывод должен печатать только права на запись для группы и мира только для каталогов) в /tmp/writeperimissions (не рекурсивно).

1 Ответ

0 голосов
/ 14 января 2019

Используйте -maxdepth 0, чтобы соответствовать только самому элементу. Таким образом:

while IFS=: read _ _ _ _ _ home _; do
  [[ -d $home ]] || continue # skip directories that do not actually exist
  find "$home" -maxdepth 0 -perm -o+w
done </etc/passwd | tee /tmp/world-writable-homedirs

Когда read передается несколько аргументов, он разбивается на поля символа в IFS (в данном случае :) и назначает каждое поле переменной, названной таким образом. Тогда в этом случае мы назначаем первые пять полей переменным с именем _, а шестое - переменной с именем home.

Не передавая -r в read, он говорит, что он должен трактовать \: как литерал :, так что вы можете иметь пользователей с двоеточиями в их понятных для человека именах или полях GECOS, не отбрасывая анализ; это фактически делает анализ на основе read более точным, чем анализ awk.

...