Труба пользователей, чтобы изменить свои пароли
Я пытаюсь заставить команду bash изменить пароли всех пользователей на x.
awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd
Могу ли я передать пользователей, которые возвращаются passwd
? Я имею в виду, это потребует какой-то петли? Если это так, пожалуйста, сделайте пример, как это сделать?
2 ответа
passwd
не читает пароли неинтерактивно, например, через STDIN, сгенерированный конвейером, в качестве альтернативы вы можете использовать chpasswd
который читает пароль через STDIN, но имеет проблемы с безопасностью.
Проблема в chpasswd
ожидает, что пароли будут даны в виде открытого текста в следующем формате:
username:password
Чтобы сделать нас несколько менее явными, мы можем последовательно сохранять пароли в отдельных строках в файле, соответствующем выводу, заданному awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd
команда. Помните, что вам нужно поддерживать последовательность вывода команды при сохранении паролей в файле.
Тогда мы можем использовать paste
генерировать формат chpasswd
хочет на свой STDIN.
Например:
paste -d: <(awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd)\
/password/file | sudo chpasswd
Вот /password/file
содержит соответствующие пароли.
В качестве меры безопасности мы можем удалить /password/file
файл потом.
Это возможно с usermod -p PASSWD USERNAME
и пока цикл. Проблема в том, что PASSWD не может быть открытым текстом, это должен быть зашифрованный пароль. Для этого вы можете использовать mkpasswd
, Таким образом, "newPassString" шифруется и остается одинаковым для всех пользователей. Вот пример того, что можно сделать всего одной строкой кода.
$ cat userlist | while read USERNAME; do echo "$USERNAME";sudo usermod -p "$(mkpasswd "newPassString")" "$USERNAME" ;done
tester
[sudo] password for xieerqi:
testuser
[sudo] password for xieerqi:
Обратите внимание, что я должен войти sudo
для каждого sudo
звонок - это моя личная обстановка В обычном, неизменном /etc/sudoers
файл, время ожидания по умолчанию составляет 15 минут, поэтому вам нужно будет ввести его только один раз.
Лучший подход - поместить код в скрипт и вызвать с параметрами $1 в качестве имени файла и $2 в качестве новой строки пароля:
xieerqi:$ cat passScript.sh
#!/bin/bash
while read USERNAME; do
echo "$USERNAME";
usermod -p "$(mkpasswd "$2")" "$USERNAME"
done < "$1"
xieerqi:$ chmod +x passScript.sh
xieerqi:$ sudo ./passScript.sh userlist myNewPass
[sudo] password for xieerqi:
tester
testuser
xieerqi:$ su testuser
Password:
testuser@eagle:/home/xieerqi$