使用来自Shell脚本中的PassWD命令
1. 概述
创建新用户以授予对系统的访问权限是 Linux 系统管理员的例行任务。该任务可能涉及多个命令,例如useradd 和passwd 命令,以及特定 Linux 安装可能需要的其他管理命令。大多数系统管理员通常会创建一个 shell 脚本来简化任务。
在本教程中,我们将快速展示在shell 脚本中使用*passwd命令的挑战。*然后,我们将研究解决问题的三种方法。
2. 准备一个简单的用户创建脚本
让我们从探索用于创建用户的简单脚本开始。首先,脚本将要创建的用户名作为第一个参数。在内部,它调用useradd和passwd命令:
#!/bin/sh
set -e
NEWUSR=$1
useradd -m -U $NEWUSR
passwd $NEWUSR
接下来,让我们设置可执行标志并对其进行测试,假设我们具有sudo 访问权限:
$ chmod +x newuser.sh
$ sudo ./newuser.sh testnewuser
Changing password for user testnewuser.
New password:
最后,我们将在提示时输入两次特定密码。如果一切正常,我们将收到成功消息:
passwd: all authentication tokens updated successfully.
3. 使脚本非交互
**如果我们想使用Jenkins 等其他工具自动创建新用户怎么办?**然后,我们需要使脚本非交互。也就是说,我们不想通过命令提示符提供新用户的密码。相反,我们希望将密码值直接传递给passwd命令。
有很多方法可以生成密码。在这里,让我们使用一组简单的命令,将当前 Unix 时间戳的 MD5 和的前 8 个字符用作密码:
$ date | md5sum | cut -c1-8
720e6264
接下来,我们将使用管道技术 将该值传递给脚本中的passwd命令:
#!/bin/sh
set -e
NEWUSR=$1
useradd -m -U $NEWUSR
PASSWD=$(date | md5sum | cut -c1-8)
echo $PASSWD | passwd $NEWUSR
让我们测试一下:
$ sudo ./newuser.sh testnewuser2
Changing password for user testnewuser2.
New password: Retype new password: Password change aborted.
New password: Password change aborted.
New password: Password change aborted.
passwd: Have exhausted maximum number of retries for service
脚本调用失败。管道成功地将密码传递给passwd命令,但它未能处理带有“重新输入新密码”指令的第二个提示。
接下来,让我们探索一些解决这个问题的方法。
3.1. 使用stdin选项
**将新密码通过管道传递给passwd命令的第一种方法是使用stdin选项。**首先,我们需要检查我们的 Linux 发行版的passwd命令是否支持该选项:
$ passwd --help | grep stdin
--stdin read new tokens from stdin (root only)
接下来,我们将其插入到脚本中:
#!/bin/sh
set -e
NEWUSR=$1
useradd -m -U $NEWUSR
PASSWD=$(date | md5sum | cut -c1-8)
echo $PASSWD | passwd --stdin $NEWUSR
最后,让我们测试一下:
$ sudo ./newuser.sh testnewuser3
Changing password for user testnewuser3.
passwd: all authentication tokens updated successfully.
3.2. 使用chpasswd
**我们在这里探讨的第二种方法是将新密码通过管道传递给chpasswd 命令。**虽然passwd期望通过输入提示输入默认模式,但chpasswd期望密码默认通过 STDIN 传递。
在脚本中,我们需要通过管道将用户名和密码用“:”分隔到chpasswd命令:
#!/bin/sh
set -e
NEWUSR=$1
useradd -m -U $NEWUSR
PASSWD=$(date | md5sum | cut -c1-8)
echo "$NEWUSR:$PASSWD" | chpasswd
最后,让我们试一试:
$ sudo ./newuser.sh testnewuser4
有趣的是,chpasswd在成功时不会输出任何消息,因为它被设计为非交互式使用。
3.3. 两次传递密码
最后一种方法被认为是hackish。因此,只有在我们的 Linux 安装上没有上述两种方法时,我们才应该选择这种方法。 **此方法涉及使用“ \n ”作为分隔符来制作包含两次密码的字符串。*例如,如果变量$PASSWD*保存密码的值,我们制作一个保存值“ $PASSWD\n$PASSWD ”的字符串。
就像前两种方法一样,我们使用echo命令将此字符串传递给普通的passwd命令:
#!/bin/sh
set -e
NEWUSR=$1
useradd -m -U $NEWUSR
PASSWD=$(date | md5sum | cut -c1-8)
echo -e "$PASSWD\n$PASSWD" | passwd $NEWUSR
但是,这次我们在 echo 命令中添加了-e ,以使 shell 解释反斜杠转义的“\n”字符。 测试脚本会显示两次询问密码的提示,就像我们交互式使用*passwd命令时一样。*但是,提示不再等待我们的输入:
$ sudo ./newuser.sh testnewuser5
Changing password for user testnewuser5.
New password: Retype new password: passwd: all authentication tokens updated successfully.