Contents

使用来自Shell脚本中的PassWD命令

1. 概述

创建新用户以授予对系统的访问权限是 Linux 系统管理员的例行任务。该任务可能涉及多个命令,例如useraddpasswd 命令,以及特定 Linux 安装可能需要的其他管理命令。大多数系统管理员通常会创建一个 shell 脚本来简化任务。

在本教程中,我们将快速展示在shell 脚本中使用*passwd命令的挑战。*然后,我们将研究解决问题的三种方法。

2. 准备一个简单的用户创建脚本

让我们从探索用于创建用户的简单脚本开始。首先,脚本将要创建的用户名作为第一个参数。在内部,它调用useraddpasswd命令:

#!/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.