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