我需要能够在我的Linux(Fedora 10)上创建用户帐户,并通过bash脚本自动分配密码(如果需要,还可以自动分配密码)。
通过Bash创建用户很容易,例如:
[whoever@server ]# /usr/sbin/useradd newuser
是否可以在Bash中分配密码,功能类似于此,但自动:
[whoever@server ]# passwd newuser
Changing password for user testpass.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[whoever@server ]#
答案 0 :(得分:181)
答案 1 :(得分:109)
您可以运行passwd命令并将其发送到管道输入。所以,做一些像:
echo thePassword | passwd theUsername --stdin
答案 2 :(得分:69)
我问自己同样的事情,并且不想依赖Python脚本。
这是在一个bash行中添加具有已定义密码的用户的行:
useradd -p $(openssl passwd -1 $PASS) $USER
答案 3 :(得分:48)
以下代码适用于Ubuntu 14.04。在其他版本/ linux变体中使用之前请先尝试。
# quietly add a user without password
adduser --quiet --disabled-password --shell /bin/bash --home /home/newuser --gecos "User" newuser
# set password
echo "newuser:newpassword" | chpasswd
答案 4 :(得分:29)
我喜欢Tralemonkey的echo thePassword | passwd theUsername --stdin
方法虽然它对我来说并不像我所写的那样有效。然而这对我有用。
echo -e "$password\n$password\n" | sudo passwd $user
-e
是将\n
识别为新行。
sudo
是Ubuntu的root访问权限。
双引号用于识别$
并扩展变量。
上面的命令将密码和新行两次传递给passwd
passwd
,这是echo -e 'password\npassword\n' | sudo passwd username
所需要的。
如果不使用变量,我认为这可能有用。
{{1}}
单引号就足够了。
答案 5 :(得分:22)
以下适用于我并在Ubuntu 14.04上进行了测试。它是一个不需要任何用户输入的单线程。
sudo useradd -p $(openssl passwd -1 $PASS) $USERNAME
取自@Tralemonkey
答案 6 :(得分:13)
您可以使用-p选项。
useradd -p encrypted_password newuser
不幸的是,这确实需要您自己散列密码(passwd会为您执行此操作)。不幸的是,似乎没有标准实用程序来散列某些数据,因此您必须自己编写。
这是一个Python脚本,我掀起来为你做加密。假设您将其命名为pcrypt,那么您可以将上面的命令行写入:
useradd -p $(pcrypt ${passwd}) newuser
需要注意的几个警告。
这里是pcrypt:
#!/usr/bin/env python
import crypt
import sys
import random
saltchars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
def salt():
return random.choice(saltchars) + random.choice(saltchars)
def hash(plain):
return crypt.crypt(arg, salt())
if __name__ == "__main__":
random.seed()
for arg in sys.argv[1:]:
sys.stdout.write("%s\n" % (hash(arg),))
答案 7 :(得分:7)
使用主目录和密码创建sudo用户的单线程。
useradd -m -p $(openssl passwd -1 ${PASSWORD}) -s /bin/bash -G sudo ${USERNAME}
答案 8 :(得分:7)
--stdin
无法在Debian上运行。它说:
`passwd: unrecognized option '--stdin'`
这对我有用:
#useradd $USER
#echo "$USER:$SENHA" | chpasswd
在这里,我们可以找到其他一些好方法:
答案 9 :(得分:6)
您可以在bash脚本中使用expect。
来自http://www.seanodonnell.com/code/?id=21
#!/usr/bin/expect
#########################################
#$ file: htpasswd.sh
#$ desc: Automated htpasswd shell script
#########################################
#$
#$ usage example:
#$
#$ ./htpasswd.sh passwdpath username userpass
#$
######################################
set htpasswdpath [lindex $argv 0]
set username [lindex $argv 1]
set userpass [lindex $argv 2]
# spawn the htpasswd command process
spawn htpasswd $htpasswdpath $username
# Automate the 'New password' Procedure
expect "New password:"
send "$userpass\r"
expect "Re-type new password:"
send "$userpass\r"
答案 10 :(得分:4)
我知道这些年后我会来,但我无法相信没有人建议使用usermod。
usermod --password `perl -e "print crypt('password','sa');"` root
天哪,如果有人想在旧HPUX上执行此操作,您可以使用usermod.sam
。
/usr/sam/lbin/usermod.sam -F -p `perl -e "print crypt('password','sa');"` username
仅当执行脚本的人是当前用户时才需要-F。当然,您不需要使用Perl来创建哈希。您可以使用openssl或许多其他命令。
答案 11 :(得分:3)
这是一个可以为你做的脚本.....
如果需要,您可以一次性添加用户列表(或仅一个用户),每个用户都有不同的密码。作为奖励,您将在脚本末尾显示每个用户密码的列表。 ....如果您需要,可以添加一些用户维护选项
像:
chage -m 18 $user
chage -M 28 $user
到将设置密码期限等的脚本。
=======
#!/bin/bash
# Checks if you have the right privileges
if [ "$USER" = "root" ]
then
# CHANGE THIS PARAMETERS FOR A PARTICULAR USE
PERS_HOME="/home/"
PERS_SH="/bin/bash"
# Checks if there is an argument
[ $# -eq 0 ] && { echo >&2 ERROR: You may enter as an argument a text file containing users, one per line. ; exit 1; }
# checks if there a regular file
[ -f "$1" ] || { echo >&2 ERROR: The input file does not exists. ; exit 1; }
TMPIN=$(mktemp)
# Remove blank lines and delete duplicates
sed '/^$/d' "$1"| sort -g | uniq > "$TMPIN"
NOW=$(date +"%Y-%m-%d-%X")
LOGFILE="AMU-log-$NOW.log"
for user in $(more "$TMPIN"); do
# Checks if the user already exists.
cut -d: -f1 /etc/passwd | grep "$user" > /dev/null
OUT=$?
if [ $OUT -eq 0 ];then
echo >&2 "ERROR: User account: \"$user\" already exists."
echo >&2 "ERROR: User account: \"$user\" already exists." >> "$LOGFILE"
else
# Create a new user
/usr/sbin/useradd -d "$PERS_HOME""$user" -s "$PERS_SH" -m "$user"
# passwdgen must be installed
pass=$(passwdgen -paq --length 8)
echo $pass | passwd --stdin $user
# save user and password in a file
echo -e $user"\t"$pass >> "$LOGFILE"
echo "The user \"$user\" has been created and has the password: $pass"
fi
done
rm -f "$TMPIN"
exit 0
else
echo >&2 "ERROR: You must be a root user to execute this script."
exit 1
fi
===========
希望这有帮助。
干杯, 卡雷尔
答案 12 :(得分:2)
来自IBM(https://www.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.cmds1/chpasswd.htm):
创建一个文本文件,比如text.txt,并用user:password对填充,如下所示:
user1:password1
user2:password2
...
usern:passwordn
保存text.txt文件,然后运行
cat text.txt | chpassword
就是这样。解决方案是(a)可扩展,(b)不涉及在命令行上打印密码。
答案 13 :(得分:2)
我已经在自己的shell脚本中进行了测试。
$new_username
表示新创建的用户$new_password
表示新密码echo "$new_password" | passwd --stdin "$new_username"
echo "$new_username:$new_password" | chpasswd
echo -e "$new_password\n$new_password" | passwd "$new_username"
答案 14 :(得分:1)
Tralemonkey的解决方案几乎对我有用......但并不完全。我最终这样做了:
echo -n '$#@password@#$' | passwd myusername --stdin
他的解决方案未包含的2个关键详细信息,-n
保持回显,将\n
添加到正在加密的密码,单引号保护内容不被shell解释(bash)就我而言。
BTW我在CentOS 5.6系统上以root身份运行此命令,万一有人想知道。
答案 15 :(得分:1)
适用于Debian和Red Hat的解决方案。取决于perl,使用sha-512哈希:
cat userpassadd
#!/usr/bin/env bash
salt=$(cat /dev/urandom | tr -dc A-Za-z0-9/_- | head -c16)
useradd -p $(perl -e "print crypt('$2', '\$6\$' . '$salt' . '\$')") $1
用法:
userpassadd jim jimslongpassword
它可以有效地用作单行,但您必须自己在正确的位置指定密码,盐和用户名:
useradd -p $(perl -e "print crypt('pass', '\$6\$salt\$')") username
答案 16 :(得分:0)
{ echo $password; echo $password; } | passwd $username
答案 17 :(得分:0)
对于RedHat / CentOS,这里是创建用户的代码,添加密码并使用户变得更加痴迷:
#!/bin/sh
echo -n "Enter username: "
read uname
echo -n "Enter password: "
read -s passwd
adduser "$uname"
echo $uname:$passwd | sudo chpasswd
gpasswd wheel -a $uname
答案 18 :(得分:0)
用法:./my_add_user.sh USER PASSWD
代码:
#!/bin/bash
# my_add_user.sh
if [ "$#" -lt 2 ]
then
echo "$0 username passwd"
exit
fi
user=$1
passwd=$2
useradd $user -d /data/home/$user -m ;
echo $passwd | passwd $user --stdin;