我有一个项目需要我编写一个脚本/命令序列来更改 CentOS 7 安装中的 root 密码。
我可以假设执行该脚本的用户已经是 root 了。
目前,我正在使用以下内容,并收到成功消息:
[root@localhost]# echo -e ‘password\npassword’ | (passwd --stdin root)
Changing password for user root.
passwd: all authentication tokens updated successfully.
但是,这实际上并没有改变密码。经过进一步检查(手动设置密码),我注意到密码password
未通过字典检查,但最后仍然报告成功:
[root@localhost]# passwd
Changing password for user root.
New password:
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
Retype new password:
passwd: all authentication tokens updated successfully.
一种可能的解决方案是尝试根据 中提供的方法和盐对给定的密码进行哈希处理/etc/shadow
,但我想避免过于复杂的解决方案。我还可以检查 中的值是否/etc/shadow
真的发生了变化,但这忽略了密码设置为原有值的情况,我希望支持这种情况。
是否有人建议在实际设置密码之前尝试验证密码,或者最好获取完整输出passwd
?
答案1
使用时passwd --stdin
只需发送一次密码即可。所以正确的版本是
echo password | passwd --stdin
如果您的代码示例是准确的,那么(a)当您需要直接的前向引号时,您就会在那里得到智能引号,并且(b)密码可能被设置为类似“password\npassword”的内容(可能两侧都有智能引号)。
答案2
使用命令让事情运转起来passwd
令人印象深刻,因为它传统上是交互式的,而且自动化起来很麻烦。(GNU 一代让它变得相对轻松,真是太好了。)但是如果你在做自动化,为什么不使用更适合自动化的命令呢,比如chpasswd
?
echo root:password | chpasswd
将执行上述操作。如果您想一次执行 50 个,只需发送更多行即可username:password
。