Что означает эта команда?

lines=$(grep '^[^:]\+::' /etc /shadow) 

Что означает вся эта команда?

Что означает '^[^:]\+::' ?

если я поставлю if else заявление вроде:

 if [ "$lines" == "" ]; then 

Будет ли отображаться (что я хочу) с пустым паролем?

grep – это команда, которая реализует команду g/<RE>/p в ed / ex (отсюда и ее имя), т. е. она обрабатывает строки, соответствующие заданному r egular e xpression (краткое выражение для регулярного выражения или regexp).

Здесь '^[^:]\+::' – это регулярное выражение (цитируется, поэтому оболочка не обрабатывает некоторые из этих символов специально). Точнее (поскольку существует несколько реализаций grep и большинство из них могут обрабатывать несколько вариантов регулярных выражений), это регулярное выражение GNU Basic.

Регулярные выражения – это шаблоны, используемые для сопоставления строк. grep сравнивает содержимое каждой строки с этим шаблоном и печатает те, которые соответствуют.

  • ^ является основным оператором регулярного выражения, который соответствует началу строки, которая должна быть сопоставлена. Мы говорим, что он привязывает поиск в начале строки, иначе поиск будет находиться где угодно внутри линии.

  • [^:] соответствует любому символу, но :

  • \+ – специфический нестандартный регулярный оператор GNU (хотя в настоящее время мы находим другие поддерживающие его реализации), что означает один или несколько предшествующих атомов. Это короткая рука для стандартного оператора регулярных выражений \{1,\} .

  • : не является особенным и соответствует самому себе.

Итак, здесь регулярное выражение соответствует строкам, которые начинаются с последовательности одного или нескольких символов, кроме следующих : за ними следуют два символа.

В контексте /etc/shadow это означает, что он совпадает с записями, которые содержат не менее 3 полей и где поле имени пользователя не пустое, но поле пароля пуст (что обычно означает, что пользователи могут войти без пароля). Он будет соответствовать root:: , x::whatever , но не root:x: or ::whatever или root:

grep также сообщает, соответствует ли он любой строке, хотя ее статус выхода:

  • если было хотя бы одно совпадение
  • fail иначе, или если произошла ошибка.

Статус выхода для назначения оболочки – это статус выхода последнего запуска команды в подстановке команд.

Например, статус выхода

 var=$(exit 2)$(exit 4) 

будет 4.

Итак, здесь вы можете:

 if lines=$(grep '^[^:]\+::' /etc/shadow); then printf 'There are users with an empty password:\n%s\n' "$lines" else printf 'OK, no user with empty passwords' fi 

grep '^[^:]\+::' /etc/shadow ничего не отображает, потому что шаблон Regex неверен.

Я предполагаю, что вы должны найти пользователей, не имеющих связанных с паролем, т.е. системных учетных записей. В этом случае выполните:

 grep '^[^:]\+:.:' /etc/shadow 

Давайте сломаем это:

  • ^[^:]\+ найдет часть от начала строки до следующего : т.е. имя пользователя

  • За именем пользователя будет следовать символ : любой символ, обозначенный токеном Regex . (возможно ! или * ), а затем :