Вопрос или проблема
У меня есть список имен пользователей, для которого мне нужно синхронизировать пароли на новом сервере.
Как я могу извлечь имя пользователя и хэш пароля из файла /etc/security/passwd в приведённом ниже формате
username:MGURSj.F056Dj
Файл passwd в формате stanza
username:
password = MGURSj.F056Dj
lastupdate = 623078865
Вы можете проанализировать файл с помощью awk
:
awk '
/^[[:alnum:]]*:/ {
user=substr($0, 1, index($0, ":") - 1)
}
/^ *password *=/ {
split($0, elements, " *= *");
print user ":" elements[2]
}' \
/etc/security/passwd
Идея скрипта заключается в том, чтобы сначала найти строку имени пользователя — одну, начинающуюся с алфавитно-цифровых символов, за которыми следует двоеточие — и извлечь это имя пользователя с помощью функции “substr”. В строках, которые начинаются с нуля или более пробелов, за которыми следует строка “password
“, за которой следуют ноль или более пробелов и знак равенства, мы разбиваем строку по знаку равенства и выводим сохраненное имя пользователя с частью пароля текущей строки.
В случае системы AIX я бы использовал более простой способ, такой как:
grep -p $USERNAME /etc/security/passwd | awk '/password/ {print $3}'
Конечно, поиск по “password” можно сделать ещё более строгим.
Ответ или решение
Для извлечения имен пользователей и хешей паролей из файла /etc/security/passwd
, который находится в формате стана, можно воспользоваться инструментом awk
. Ниже приведен скрипт на awk
, который позволяет получить данные в нужном формате:
awk '
/^[[:alnum:]]*:/ {
user=substr($0, 1, index($0, ":") - 1)
}
/^ *password *=/ {
split($0, elements, " *= *")
print user ":" elements[2]
}' /etc/security/passwd
Объяснение работы скрипта:
- Сначала мы ищем строки, которые начинаются с алфавитно-цифровых символов и содержат двоеточие. При нахождении такой строки извлекаем имя пользователя с помощью функции
substr
. - Затем ищем строки, начинающиеся с нуля или более пробелов, за которыми следует строка «password», и равенство с некоторым содержимым. Эти строки содержат хеш пароля.
- Используя команду
split
, разбиваем строку по символу равенства и выводим имя пользователя в форматеusername:password_hash
.
Если вы работаете в среде AIX, можно использовать более простой способ с комбинацией команд grep
и awk
. Например, для поиска определенного пользователя, можно воспользоваться следующей командой:
grep -p $USERNAME /etc/security/passwd | awk '/password/ {print $3}'
Объяснение:
- Команда
grep -p $USERNAME
ищет строки, связанные с конкретным пользователем. - Затем
awk
извлекает часть строки, содержащую хеш пароля, выводя результат в форматеusername:password_hash
.
Используя вышеуказанные инструменты, вы сможете эффективно извлекать информацию о пользователях и их паролях в требуемом формате для дальнейшей синхронизации на новом сервере.