1

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

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

sudo lastlog -b 90

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

2 ответа2

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 означает инвертированное совпадение (выберите несовпадающие строки).
0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .