我正在使用Puppet来pipe理用户密码。 (是的,我知道LDAP比较好,但是我从上级被告知使用Puppet)。我有这个类,当以root身份运行时,将bob的密码更改为“bobs_new_password”。 当bob运行它的时候,理想情况下应该提示input一个新的密码,但是我应该可以在以后添加这个function。 当我以puppet agent --test root puppet agent --test运行它时,它表示一切正常,并通知我新的散列,所以我知道它已经在/etc/shadow文件中正确设置了。 现在,我只和虚拟机上的testing用户合作,所以我并不担心通知散列的安全风险; 该行显然将被取代为工作版本的代码。 我到目前为止是这样的:
class pwdchange ($newpwd = 'bobs_new_password', $targetuser = "bob") { $temp = inline_template("<%= Digest::MD5.digest(scope.lookupvar('newpwd'))%>") $hashtypeidentifier = '$1$' #'$1' for MD5, '$6' for sha512. user {"$targetuser": ensure => present, password => "${hashtypeidentifier}${temp}", } notify {"${temp}":} }
但是,当我以sob的身份login到虚拟机时,旧密码或新密码都不被接受。 我究竟做错了什么? 为什么不接受任何一个密码,我能做些什么来解决它?
影子文件中的MD5密码格式$1$salt$hash ,在代码中没有看到任何盐分。
另请参见如何为Ubuntu 10.04生成兼容/ etc / shadow的密码?
另请参阅Ruby的crypt()函数,它将为您生成完整的影子文件string。