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


200

我需要具有在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 ]#

11
为什么这是题外话?
OrangeTux

16
我认为这个问题是话题。现在,最强劲的趋势之一是DevOps对“将代码配置为代码”的态度,即通过“编程”一系列引导平台的管理步骤来创建平台。以脚本模式进行用户管理绝对是该编程的一部分。
丹·伯格·约翰逊

2
作为一个DevOps,我认为这是一个有用的问题(有有用的答案),但是那是我的SysAdmin帽子所在的地方。将其移至SuperUser可能更有意义。
Anthony Geoghegan 2014年


这也可以通过expect脚本解决。
Yaron

Answers:


122

您可以运行passwd命令并将其发送给管道输入。因此,请执行以下操作:

echo thePassword | passwd theUsername --stdin

3
该方法的好处是它安全(echo至少在使用过的shell中是内置的,这很常见)/proc/
玛丽安2010年

8
我不得不echo -e "password\npassword\n" | passwd在13.04
d0c_s4vage 2014年

31
--stdin在较新的Linux系统中已弃用。请改用chpasswd。
wuxb

16
@MarkusOrreilly可以工作,但在使用诸如Ansible的供应工具时不起作用。如@Nybble所述,您应该使用chpasswd。所以这是有效的方法:echo 'myuser:mypass' | chpasswd。希望能有所帮助。
Amir Rustamzadeh 2014年

我可以将其放入docker文件中吗?我认为它应该可用于docker。
qubsup

201

您也可以使用chpasswd

echo username:new_password | chpasswd

所以,你更改密码的用户usernamenew_password


5
+1,这是工作的正确工具:$ apropos chpasswd...chpasswd (8) - update passwords in batch mode
史蒂文·K

这也适用于busybox,而不适用于passwd(没有--stdin选择)。
Timmmm

83

我在问自己同样的事情,不想依靠Python脚本。

这是在一条bash行中添加具有定义密码的用户的行:

useradd -p $(openssl passwd -1 $PASS) $USER

25
useradd -p $(openssl passwd -1 $PASS) $USER较现代,因为不$()建议使用反引号。
布赖森2014年

我遇到的一个问题是:我用zsh的外壳创建了我的用户,但当时还没有意识到尚未安装zsh。如果执行此操作,密码登录将失败,因此在您认为此密码不起作用之前(肯定会在今天的Arch和Debian 7上运行),您可能会在全新安装上进行检查。
布赖森2014年

2
useradd -m -p <password> -s /bin/bash <user>,-m创建主目录,-s指定用户默认的shell,替代passworduser满足您的需求。
雷神召唤师

2
您还可以添加密码:useradd -m -p $(openssl passwd -1 -salt $SALT $PASS)。我认为这在以后的Ubuntu上是必需的。
craigmj '17

55

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

3
我不明白--gecos
Alban 2014年

11
en.wikipedia.org/wiki/Gecos_field gecos字段(或GECOS字段)是Unix和类似操作系统上/ etc / passwd文件中的条目。它通常用于记录有关帐户或其用户的常规信息,例如其真实姓名和电话号码。GECOS表示通用电气综合操作系统,当GE的大型系统部门出售给霍尼韦尔时,该系统已更名为GCOS。
2014年

这是在Debian 8上对我来说正确的答案,在我的服务器设置bash脚本上就像一个魅力一样!
levelzwo

GECOS字段基本上是用户描述字段。在那写下你想要的任何东西。
КонстантинВан”,19年

30

我喜欢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

单引号在这里就足够了。


2
在bash中效果很好。但是,如果在sh中运行,则-e选项不起作用。我发现了实际上输出“ -e”的困难方法。幸运的是,在sh中不需要-e选项,默认情况下是转义。便携式版本使用printf“ password \ npassword \ n” | ...代替。
丹·伯格·约翰逊

ubuntu的完美答案。
马什比·拉曼

23

以下对我有用,并在Ubuntu 14.04上进行了测试。它是一种无需任何用户输入的衬板。

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

取自@Tralemonkey


13

您可以使用-p选项。

useradd -p encrypted_password newuser

不幸的是,这确实需要您自己对密码进行哈希处理(passwd会为您提供密码)。不幸的是,似乎没有一个标准的实用工具来散列某些数据,因此您必须自己编写。

这是我整理的一个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),))

感谢R Klatchko,应该可以。我不敢相信我对-p选项一无所知。我可以照顾自己的哈希:)
ModernCarpentry,2010年

5
的perl -e '打印隐窝($ ARGV [0], “密码”)' '输入mypassword'
mikewaters

您能否解释一下,我以后如何使用密码而不是哈希密码?
answerSeeker '17

12

使用单一衬里创建具有主目录和密码的sudo用户。

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

太棒了 在部署脚本中效果很好
TheRealChx101 '19


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"

5

我知道这几年后会来,但是我不敢相信没有人建议使用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或其他许多命令代替它。


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

===========

希望这可以帮助。

干杯,卡雷尔


2

我已经在自己的Shell脚本中进行了测试。

  • $new_username 表示新创建的用户
  • $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"

1

Tralemonkey的解决方案也几乎对我有用...但是效果不佳。我最终以这种方式这样做:

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

他的解决方案未包括2个关键细节,-n保持回显,\n避免在要加密的密码上添加a ,单引号保护内容(在我的情况下)不被外壳(bash)解释。

顺便说一句,以防万一,我在CentOS 5.6系统上以根用户身份运行了此命令。


好捕获,不确定其他人如何使它与newline配合使用。
M03 '18

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

它可以有效地用作单行,但是您必须在正确的位置自行指定密码,salt和用户名:

useradd -p $(perl -e "print crypt('pass', '\$6\$salt\$')") username


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

虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分。
2015年

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

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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.