如何自动添加用户帐户和密码与Bash脚本?

我需要能够在我的Linux(Fedora 10)上创build用户帐户,并通过bash脚本自动分配密码(否则,如果需要的话)。

通过Bash创build用户很容易,例如:

[whoever@server ]# /usr/sbin/useradd newuser 

是否可以在Bash中分配一个密码,在function上与此类似,但是会自动:

 [whoever@server ]# passwd newuser Changing password for user testpass. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully. [whoever@server ]# 

您可以运行passwd命令并发送pipe道input。 所以,做一些事情:

 echo thePassword | passwd theUsername --stdin 

你也可以使用chpasswd :

 echo username:new_password | chpasswd 

因此,您将用户用户username密码更改为new_password

我问自己同样的事情,不想依靠Python脚本。 这是用一个bash行添加用户定义密码的行:

 /usr/sbin/useradd -p \`openssl passwd -1 $PASS\` $USER 

我喜欢Tralemonkey的echo thePassword | passwd theUsername --stdin的方法 echo thePassword | passwd theUsername --stdin虽然它不像我写的那样工作。 这对我而言是有效的。

 echo -e "$password\n$password\n" | sudo passwd $user 

-e将识别\n作为新行。

sudo是Ubuntu的root权限。

双引号是识别$并扩展variables。

上面的命令传递密码和一个新行两次passwd ,这就是passwd要求的。

如果不使用variables,我认为这可能有效。

 echo -e 'password\npassword\n' | sudo passwd username 

单引号就足够了。

下面的代码在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 

以下工作适合我,并在Ubuntu 14.04上testing。 这是一个不需要任何用户input的单行代码。

 sudo useradd -p $(openssl passwd -1 $PASS) $USERNAME 

来自@Tralemonkey

您可以使用-p选项。

 useradd -p encrypted_password newuser 

不幸的是,这确实需要你自己散列密码(passwd在那里为你做的)。 不幸的是,似乎没有一个标准的工具来散列一些数据,所以你必须自己写。

这里有一个我为了给你做encryption的Python脚本。 假设你把它叫做pcrypt,那么你可以把你的上面的命令行写到:

 useradd -p $(pcrypt ${passwd}) newuser 

几个警告要注意。

  1. 当pcrypt运行时,任何用户都可以通过ps命令看到明文。
  2. pcrypt使用旧式的crypt函数 – 如果你正在使用像MD5哈希这样的更现代的东西,你需要改变pcrypt。

这里是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),)) 

--stdin在Debian上不起作用。 它说:

 `passwd: unrecognized option '--stdin'` 

这对我工作:

 #useradd $USER #echo "$USER:$SENHA" | chpasswd 

在这里,我们可以find其他一些好方法:

你可以在你的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" 

我知道今年晚些时候我会来,但我不能相信没有人build议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来创build哈希。 你可以使用openssl或其他许多命令。

这是一个脚本,将为你做…

你可以添加一个用户列表(或只是一个用户),如果你愿意,所有在一个去,每个将有不同的密码。 作为奖励,您将在脚本末尾显示每个用户密码的列表。 ….如果你想要,你可以添加一些用户维护选项

喜欢:

 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 

===========

希望这可以帮助。

干杯,Carel

这个解决scheme可以在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 

单线程创build一个sudo用户的主目录和密码。

 useradd -m -p $(openssl passwd -1 ${PASSWORD}) -s /bin/bash -G sudo ${USERNAME} 

Tralemonkey的解决scheme几乎为我工作…但不完全。 我最终这样做了:

 echo -n '$#@password@#$' | passwd myusername --stdin 

他的解决scheme中没有包含2个关键细节, -n保持回应,在encryption的密码中添加\n ,单引号保护内容不被shell解释(bash)。

顺便说一句,我在CentOS 5.6系统上以root身份运行这个命令,以防万一有人想知道。

 { echo $password; echo $password; } | passwd $username 

来自IBM( https://www.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.cmds1/chpasswd.htm ):

创build一个文本文件,说text.txt并填入用户:密码对,如下所示:

 user1:password1 user2:password2 ... usern:passwordn 

保存text.txt文件,然后运行

 cat text.txt | chpassword 

而已。 解决scheme是(a)可扩展的,(b)不涉及在命令行上打印密码。

对于RedHat / CentOS,这是创build用户的代码,添encryption码并使用户成为sudoer:

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

用法: ./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; 

我已经testing了我自己的shell脚本。

  • $new_username表示新创build的用户
  • $new_password表示新的密码

对于CentOS

 echo "$new_password" | passwd --stdin "$new_username" 

对于Debian / Ubuntu

 echo "$new_username:$new_password" | chpasswd 

对于OpenSUSE

 echo -e "$new_password\n$new_password" | passwd "$new_username"