未为此用户创建脚本设置密码

未为此用户创建脚本设置密码

以下脚本应该在 Ubuntu 计算机上创建用户并生成随机密码:

#!/bin/bash

#Script should execute with sudo/root access
if [[ "${UID}" -ne 0 ]]
then
    echo "Please run with sudo or root"
    exit 1
fi

#User should provide atleast one argument as username else guide him
if [[ "${#}" -lt 1 ]]
then
    echo "Usage: ${0} USER_NAME [COMMENT]..."
    echo "Create a user with name USER_NAME and comments field of COMMENT"
    exit 1
fi

#Store 1st argument as user name
USER_NAME="${1}"

#In case of more than one argument, store it as account comments
shift
COMMENT="${@}"

#Create a password
 PASSWORD=$(date +%s%N)

#Create the user
useradd -c "$COMMENT" -m $USER_NAME

#Check if user is successfully created or not
if [[ $? -ne 0 ]]
then
    echo "The Account could not be created"
    exit 1
fi

#Set the password for the user
echo $PASSWORD | passwd --stdin $USER_NAME

#Check if password is successfully set or not
if [[ $? -ne 0 ]]
then
    echo "The password could not be set"
    exit 1
fi

#Force password change on first login
passwd -e $USER_NAME

#Display username, password and the host where the user was created
echo
echo "Username: $USER_NAME"
echo
echo "Password: $PASSWORD"
echo
echo "Hostname: $(hostname)"

输出:

root@Sengh:/home/sengh/scripts# bash user_create.sh singh this is a
passwd: unrecognized option '--stdin'
Usage: passwd [options] [LOGIN]

Options:
  -a, --all                     report password status on all accounts
  -d, --delete                  delete the password for the named account
  -e, --expire                  force expire the password for the named account
  -h, --help                    display this help message and exit
  -k, --keep-tokens             change password only if expired
  -i, --inactive INACTIVE       set password inactive after expiration
                                to INACTIVE
  -l, --lock                    lock the password of the named account
  -n, --mindays MIN_DAYS        set minimum number of days before password
                                change to MIN_DAYS
  -q, --quiet                   quiet mode
  -r, --repository REPOSITORY   change password in REPOSITORY repository
  -R, --root CHROOT_DIR         directory to chroot into
  -P, --prefix PREFIX_DIR       directory prefix
  -S, --status                  report password status on the named account
  -u, --unlock                  unlock the password of the named account
  -w, --warndays WARN_DAYS      set expiration warning days to WARN_DAYS
  -x, --maxdays MAX_DAYS        set maximum number of days before password
                                change to MAX_DAYS

The password could not be set

答案1

它不起作用的原因在命令的输出中很明显,正如多个评论已经指出的那样:

passwd: unrecognized option '--stdin'

你说你在 youtube 上成功了。好吧,很多事情可能在 youtube(或任何其他教程)中有效,但由于不同的发行版、工具版本等,不适合您。在您的具体情况下,您可以在在 Shell 脚本中使用 passwd 命令LinuxOPsys 教程:

注意:如果您看到错误消息passwd: unrecognized option '--stdin',则意味着您系统上的 passwd 命令不支持该--stdin选项。此选项通常在 CentOS Stream 或 RHEL 等某些发行版上可用,但在其他发行版(如 Ubuntu)上可能不存在。

所以 YouTube 视频中的人可能使用了支持此选项的发行版之一。然而,在您的发行版上,这个选项显然是不是可用的。

为什么大多数实现不passwd支持此选项?您可以在下面找到这个问题的答案bash 常见问题解答页:

传统的passwd(1)不从标准输入读取。这是 故意的。这是为了保护您。密码从来都不是为了放入程序或生成的经过程式。它们只能由具有正常大脑的真实人类的手指输入,并且永远不会被写在任何地方。因此,在继续之前,请考虑一下作者的 passwd(1)观点的可能性,并且您可能不应该正在尝试编写脚本passwd(1)输入。

如果您在阅读上面的警告后仍然坚持使用脚本自动化它,您可以在相同的 LinuxOPsys 教程中找到答案 使用 chpasswd部分,正如 @NicolasFormichella 的建议回答

评论了对于这个答案:

我不想提及需要设置密码的用户,而是希望它使用变量从用户中读取需要创建的用户。

好吧,您仍然可以使用变量。代替

echo $PASSWORD | passwd --stdin $USER_NAME

使用:

echo "$USER_NAME:$PASSWORD" | chpasswd

但一般来说,您不应该相信您遇到的任何 YouTube 视频。

答案2

你想要的是chpasswd

man 8 chpasswd状态 :

chpasswd - 以批处理模式更新密码

用法示例

echo "example:example" | chpasswd

example会更改用户的密码

相关内容