chpasswd 和 openssl

chpasswd 和 openssl

我正在尝试将 MD5 密码传递给 chpasswd,但它似乎不起作用。

echo username:$(openssl passwd -1 -salt salt password)

然后我尝试将其传递给chpasswd更改密码

echo 'username:$1$salt$aldkjflsfj' | /usr/sbin/chpasswd -e

然而,当我这样做时,密码更改似乎没有生效——/etc/shadow已更新,但如果我尝试使用密码,它不起作用。

这确实有效:

echo username:password | /usr/sbin/chpasswd

passwd也有效

更多信息:

$ S=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 5 | head -n 1)
$ echo username:$(openssl passwd -1 -salt "$S" password)
 username:$1$nPkvS$eKljAIRsFLXOffXti.ZtO/
$ echo 'username:$1$nPkvS$eKljAIRsFLXOffXti.ZtO/' | chpasswd -e
$  grep username /etc/shadow
username:$1$nPkvS$eKljAIRsFLXOffXti.ZtO/:16722:0:99999:7:::

答案1

参数必须加引号,否则 shell 会验证特殊字符在这些参数中:

echo "username:"$(openssl passwd -1 -salt "$salt" "$password")

此处使用双引号,让 shell 计算变量。

现在,该echo命令也必须被引用:

echo 'username:$1$salt$aldkjflsfj' | ...

此处使用单引号,因为 $ 符号是条目的一部分并且必须保留。


警告: 我不建议这样更改密码。这些命令以及明文密码可以在ps和的列表中看到topopenssl针对这种情况有一种机制,可以从文件中读取密码。

相关内容