非交互式“chpasswd -e”的替代品?

非交互式“chpasswd -e”的替代品?

在较旧的 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

使用该脚本的风险需自行承担。

相关内容