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

0xC*_*22L 6 users passwd-file

在较旧的 Debian 机器上,可能会发出类似的问题:

echo '<username>:*'|chpasswd -e
Run Code Online (Sandbox Code Playgroud)

为了将用户 ( <username>)的密码字段更改为*.

现在我知道

passwd -d <username> && passwd -l <username>
Run Code Online (Sandbox Code Playgroud)

以达到类似的效果并将密码字段设置为!. 但是,在一些较新的 vanilla Ubuntu 配置(特别是 10.04 LTS)上,这会导致用户无法再登录机器(例如通过 SSH 和密钥)Your account has expired; please contact your system administrator.- 即使passwd(1)“警告”这是可能的。

不过,现在这正是我想要实现的目标。手动更改/etc/shadow文件中的字段from!*解决问题,但似乎没有可编写脚本的方法来实现相同的目的而不直接摆弄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.

Bas*_*erg 2

使用一个简单的脚本,就像我刚刚写的这样:

#!/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
Run Code Online (Sandbox Code Playgroud)

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