Труба пользователей, чтобы изменить свои пароли

Я пытаюсь заставить команду 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$ 
Другие вопросы по тегам