通过脚本更改root密码失败,但报告成功

我有一个项目,要求我在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. 

一个可能的解决scheme是尝试散列基于/etc/shadow提供的方法和salt的给定密码,但是我想避免一个过于复杂的解决scheme。 我还可以检查/etc/shadow的值是否真的发生了变化,但是忽略了密码设置为已经存在的情况,我想支持这种情况。

有没有人有实际设置之前尝试validation密码的build议,或者,最好从passwd获得完整的输出?

当使用passwd --stdin你只需要发送一次密码。 所以正确的版本是

 echo password | passwd --stdin 

如果您的代码示例是准确的,那么(a)当您需要简单的前向引用时,您会有精明的引号;(b)密码可能被设置为“password \ npassword”(可能带有任何一方的引号)。

使用passwd命令工作是令人印象深刻的,因为它传统上是交互式的,很难自动化。 (对于gnu代来说,Yay是相对无痛的。)但是如果你在做自动化,为什么不使用自动化更友好的命令,比如chpasswd

 echo root:password | chpasswd 

会做你在做什么。 如果你想一次执行50个,只需发送更多行username:password