以下脚本应该在 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
会更改用户的密码