在较旧的 Debian 机器上,可以发出以下命令:
echo '<username>:*'|chpasswd -e
为了将用户的密码字段(<username>
)更改为*
。
现在我知道了
passwd -d <username> && passwd -l <username>
实现相似的效果并将密码字段设置为!
。但是,在某些较新的 vanilla Ubuntu 配置(特别是 10.04 LTS)上,这会导致用户无法再登录机器(例如通过 SSH 和密钥)- 使用:Your account has expired; please contact your system administrator.
- 即使passwd(1)
“警告”这是可能的。
但现在这正是我想要实现的。手动将文件中的字段/etc/shadow
从更改为!
可以*
解决问题,但似乎没有可编写脚本的方法来实现相同的目的,而无需直接摆弄文件shadow
(例如使用sed
)。chpasswd -e
曾经是一个方便的替代方法,但显然已被删除。
因此,我正在寻找一种passwd -l
可以让我选择写入文件的令牌的变体,或者任何其他类型的替代品精确的提供的功能chpasswd -e
。
注意: *
已经用于系统帐户,并且密码字段中的!
和与 PAM 或其他内容似乎存在语义差异。*
另请注意:在 Debian 5 和 6 上chpasswd -e
可以运行。因此,Ubuntu 中肯定故意删除了该功能。我测试了 Ubuntu 9.10、10.04(它们没有该功能),11.04 和 11.10 有该功能chpasswd -e
。
答案1
使用像我刚刚写的这个简单的脚本:
#!/bin/bash
USER=$1
if [[ -z "$USER" ]]; then
echo "From which user should I clear the password?"
read USER
fi
if chpasswd -e -h > /dev/null 2>&1; then
echo "$USER:*"|chpasswd -e
else
passwd -d $USER
cp /etc/shadow /etc/shadow.old
USEROLD=$USER::
USERNEW=$USER:*:
sed -i "s/$USEROLD/$USERNEW/g" /etc/shadow.old
cp /etc/shadow.old /etc/shadow
fi
使用该脚本的风险需自行承担。