На этом этапе я бы сказал, что основная причина - обратная совместимость - разделение каталога существовало с самого начала, в V4 (это четвертый выпуск UNIX, а не SVR4). Тогда могло быть любое количество причин: избегать необходимости обрабатывать множество файлов в одном каталоге, думать о справочных страницах как о частях книги ...
Это будет перебирать каждого пользователя в /etc/passwd
с оболочкой /bin/bash
, затем grep
для пользователя в /var/log/auth.log
, затем использовать awk
, чтобы проверить, является ли пятое поле «sudo» :' и шестое имя пользователя, sort
и uniq
затем используются для возврата списка пользователей, которые использовали sudo
(, которые также имеют оболочку /bin/bash
в/etc/passwd
:
for user in $(awk -F: '$7 == "/bin/bash"{print $1}' /etc/passwd);do
grep "$user" /var/log/auth.log|\
awk -v user="$user" '$5 == "sudo:" && $6 == user {print user}'
done | sort | uniq
Глядя на это с другой стороны :Получите всех пользователей, которые недавно использовали sudo
и перечислите тех, у которых bash
в качестве оболочки для входа в систему:
sed -nE 's/.*[0-9] ([^ ]+) sudo:.*/\1/p' </var/log/auth.log | sort -u |
while read user; do
getent passwd "$user" |
awk -F ':' '$NF == "/bin/bash" { print $1 }'
done
Выражение sed
извлекает имена пользователей, которые использовали sudo
, sort -u
сортирует их и удаляет дубликаты, а цикл проверяет, установили ли эти оставшиеся пользователи /bin/bash
в качестве оболочки входа в систему. Если они есть, печатается имя пользователя.
Имеет смысл делать это в таком порядке, если файл auth.log
действительно большой и вы не хотите анализировать его по одному разу для каждого bash
пользователя. Вместо этого мы запускаем getent
один раз для каждого пользователя в файле журнала. Но мы можем улучшить это...
В предложенном порядке:
getent passwd |
awk -F ':' '$NF == "/bin/bash" { printf("s/.*[0-9] (%s) sudo:.*/\\1/p\n", $1) }' |
sed -nE -f - /var/log/auth.log | sort -u
Здесь сценарий awk
создает сценарий sed
. На моей тестовой машине Ubuntu этот скрипт будет выглядеть как
s/.*[0-9] (root) sudo:.*/\1/p
s/.*[0-9] (ubuntu) sudo:.*/\1/p
s/.*[0-9] (myself) sudo:.*/\1/p
s/.*[0-9] (otheruser) sudo:.*/\1/p
Этот сценарий sed
затем запускается для файла журнала auth.log
и выводит именаbash
-с использованием пользователей, которые недавно использовали sudo
. Результат сортируется и дубликаты удаляются.
Здесь мы не анализируем файл журнала более одного раза, и, кроме того, нам не требуется более одного вызова getent
.