我正在尝试让 bash 命令将所有用户的密码更改为 x。
awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd
我可以通过管道传输返回的用户吗passwd
?我的意思是这是否需要某种循环?如果是这种情况,请举个例子说明如何做到这一点?
答案1
passwd
不会以非交互方式读取密码,例如通过管道生成的 STDIN,作为替代方案,您可以使用chpasswd
通过 STDIN 读取密码,但存在安全问题。
问题是chpasswd
要求密码以明文形式给出,格式如下:
username:password
为了让我们更直白一些,我们可以将密码按顺序保存在与命令输出相对应的文件中的单独行中awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd
。请记住,在文件中保存密码时,您需要保持命令输出的顺序。
然后我们就可以使用它在其 STDIN 上paste
生成想要的格式。chpasswd
例如:
paste -d: <(awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd)\
/password/file | sudo chpasswd
这里/password/file
包含相关的密码。
作为安全措施,我们可以/password/file
随后删除该文件。
答案2
使用 while 循环是可能的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$