Сопоставить список пользователей с /etc/passwd

Сопоставить список пользователей с /etc/passwd

У меня есть простой список пользователей в один столбец. Он берется из команды lastlog. Мне нужно знать, отключены ли эти учетные записи, и у меня нет прав root. Я могу только просматривать с помощью more и выполнять команду lastlog. Мне нужно узнать, активны ли пользователи, которые не входили в систему в течение последних 90 дней.

Пока что я выполняю

sudo lastlog -b 90

Что дает мне пользователей, которые вошли в систему... за последние 90 дней. Теперь я просто запускаю его через awk, печатая первое поле, и это мой простой список пользователей. Теперь я хотел бы в основном посмотреть, есть ли в /etc/passwd их оболочка /bin/bash и есть ли в /etc/shadow !в их строке . Как мне это сделать. Я пробовал циклы for и while и, похоже, не могу сделать это правильно? Любая помощь будет оценена по достоинству.

решение1

Я не уверен, правильно ли я вас понял. Это то, что вы ищете?

lastlog -b 90 | awk '{if (NR > 1) print $1 }' | grep -f - /etc/passwd | grep "/bin/bash$"

Вот разбивка:

  • awk '{if (NR > 1) print $1 }'- вывести первый столбец, пропустив первую строку (заголовок lastlog)
  • grep -f - /etc/passwd- использовать стандартный ввод как файл для получения шаблонов и поиска шаблонов в/etc/passwd
  • grep "/bin/bash$"- grep для /bin/bash, $означает EOL.

Несколько заметок:

  • lastlog -b 90- который дает вам записистаршаячем 90 дней. Если вы хотите пользователей, которые вошли в систему в течение последних 90 дней, используйте lastlog -t 90.
  • Я выбрал (NR > 1)решение только потому, что мы используем его awkв любом случае. Более лаконичный способ пропустить первую строку файла был бы sed 1d.

РЕДАКТИРОВАТЬ

Вы можете использовать похожую идиому, если вы также хотите отфильтровать записи из !/etc/shadow. Таким образом, полная команда будет выглядеть так:

lastlog -b 90 | awk '{if (NR > 1) print $1 }' | grep -f - /etc/passwd | grep "/bin/bash$" | cut -d ':' -f 1 | grep -f - /etc/shadow | grep -v ":\!:"
  • cut -d':' -f 1разбивает строку, используя :в качестве разделителя, и возвращает первое поле
  • grep -vозначаетинвертировать совпадение(выберите несовпадающие строки).

решение2

Восклицательный знак, как вы заметили, нужно «экранировать» — попробуйте ввести его поиск с обратной косой чертой: \! вместо !, чтобы он не выполнялся как команда, а обрабатывался как текст. Во многих случаях вы также можете заключить его в одинарные кавычки (не двойные), например: '!' — в зависимости от выбранной вами команды, один из них должен это сделать.

Связанный контент