1. 关于chpasswd

  chpasswd 命令用于 Linux 系统中用于批量修改用户的密码。它通常与 shell 脚本结合使用,以便高效地更新多个用户的密码信息。

chpasswd 命令的基本语法:

chpasswd [options] [file]
  • 1.

参数解释:

  • - [options]: 可以指定一些选项来改变 chpasswd 的行为。
  • - file: 可选参数,指定包含用户名和新密码的文件路径。如果未指定文件,则从标准输入读取。

常见[options]选项

  • -e: 将密码转换为加密格式后存储。
  • -h <hash>: 使用指定的哈希算法(如 SHA-512)来加密密码。
  • -R <directory>: 指定 shadow 文件所在的目录。

chpasswd 命令要求输入的格式为每行一个用户,格式如下:

username:password

  • - username:指定要更改密码的用户账户名;
  • - password:指定新密码。如果密码为空,表示删除该用户的密码;

2. chpasswd基础使用示例

假设你有一个文本文件 users.txt,其中包含了需要更改密码的用户列表,格式如下:

john:mynewpassword

jane:newpass123

然后你可以使用以下命令来批量更改这些用户的密码:

chpasswd < users.txt
  • 1.

如果你想通过标准输入来提供用户列表,可以这样做:

echo "john:mynewpassword" | chpasswd
  • 1.

当然,你也可以使用多行输入:

cat <<EOF | chpasswd
john:mynewpassword
jane:newpass123
EOF
  • 1.
  • 2.
  • 3.
  • 4.

注意事项

- 使用 chpasswd 时,请确保提供的密码符合系统安全策略,通常情况下,密码应该足够复杂,并且符合 /etc/login.defs 文件中的密码策略设置。

- chpasswd 命令通常需要 root 权限才能执行,因为修改密码涉及系统安全。

3. 生产运维示例

假设你需要创建一个脚本来批量更改一组用户的密码,你可以创建一个简单的 shell 脚本,如下所示:

#!/bin/bash

# 定义包含用户和密码的文件
users_file="users.txt"

# 检查文件是否存在
if [ ! -f "$users_file" ]; then
    echo "File $users_file does not exist."
    exit 1
fi
# 使用 chpasswd 命令批量更改密码
chpasswd < "$users_file"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

在这个示例中,你需要先准备一个名为 users.txt 的文件,其中每一行都是用户名和新密码,格式为 username:password。

4. 结合Linux下的crontab周期性修改密码

(1)创建密码文件及改密脚本:
touch /etc/init.d/changpw.sh
echo '#!/bin/bash' >>/etc/init.d/changpw.sh
echo 'users_file="users.txt" >>/etc/init.d/changpw.sh
echo ' chpasswd < "$users_file" >>/etc/init.d/changpw.sh
chmod 700 /etc/init.d/changpw.sh
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
(2)添加crontab

注意事项:在使用crontab修改密码时,对于新手而言有一个常见的困惑就是crontab执行后未按预期修改了密码,反而是密码未被成功修改。造成此问题的原因在于crontab环境变量加载不全,导致调用shell脚本中指定的命名失败。解决办法:在crontab文件中添加环境变量,例如下面的演示:

a.CentOS、Kylin序列操作系统:
touch /var/spool/cron/root
chmod 600 /var/spool/cron/root
echo " " >> /var/spool/cron/root
sed -i '$a SHELL=/bin/bash\nPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin\n\n\n00 05 1 */3 * /etc/init.d/changpw.sh >/dev/null 2>&1' /var/spool/cron/root
  • 1.
  • 2.
  • 3.
  • 4.
b.SUSE序列操作系统:
touch /var/spool/cron/tabs/root
chmod 600 /var/spool/cron/tabs/root
echo " " >> /var/spool/cron/tabs/root
sed -i '$a SHELL=/bin/bash\nPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin\n\n\n00 05 1 */3 * /etc/init.d/changpw.sh >/dev/null 2>&1' /var/spool/cron/tabs/root
  • 1.
  • 2.
  • 3.
  • 4.