222

我需要能够在我的 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 ]#
4

19 回答 19

222

您也可以使用chpasswd

echo username:new_password | chpasswd

因此,您将用户的密码更改usernamenew_password.

于 2011-10-09T03:41:38.467 回答
133

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

echo thePassword | passwd theUsername --stdin
于 2010-01-27T23:30:23.790 回答
110

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

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

useradd -p $(openssl passwd -crypt $PASS) $USER
于 2010-02-24T18:37:54.627 回答
67

下面的代码在 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
于 2014-08-25T05:35:10.603 回答
35

我喜欢 Tralemonkey 的方法,echo thePassword | passwd theUsername --stdin尽管它对我来说并不像写的那样工作。然而,这对我有用。

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

-e是识别\n为新行。

sudo是 Ubuntu 的根访问权限。

双引号用于识别$和扩展变量。

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

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

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

单引号在这里就足够了。

于 2010-12-21T09:30:35.493 回答
27

以下对我有用,并在 Ubuntu 14.04 上进行了测试。这是一个不需要任何用户输入的单行。

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

取自@Tralemonkey

于 2014-05-28T03:37:06.750 回答
18

使用主目录和密码创建 sudo 用户的单行。

useradd -m -p $(openssl passwd -1 ${PASSWORD}) -s /bin/bash -G sudo ${USERNAME}
于 2017-06-05T07:27:19.953 回答
12

您可以使用 -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),))
于 2010-01-27T22:53:11.300 回答
8

--stdin不适用于 Debian。它说:

`passwd: unrecognized option '--stdin'`

这对我有用:

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

在这里我们可以找到一些其他的好方法:

于 2011-08-20T00:59:05.423 回答
6

您可以在 bash 脚本中使用期望。

来自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"
于 2010-01-27T22:56:23.913 回答
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 或许多其他命令代替它。

于 2015-05-21T22:50:48.767 回答
4

我已经在自己的 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"
于 2017-04-07T08:59:13.450 回答
3

Here is a script that will do it for you .....

You can add a list of users (or just one user) if you want, all in one go and each will have a different password. As a bonus you are presented at the end of the script with a list of each users password. .... If you want you can add some user maintenance options

like:

chage -m 18 $user
chage -M 28 $user

to the script that will set the password age and so on.

=======

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

===========

Hope this helps.

Cheers, Carel

于 2010-05-29T23:26:33.203 回答
1

Tralemonkey 的解决方案几乎也对我有用……但并不完全。我最终这样做了:

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

他的解决方案没有包括 2 个关键细节,在我的情况下,-n保持回声不会将 a 添加\n到正在加密的密码中,并且单引号保护内容不被 shell(bash)解释。

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

于 2011-06-25T01:54:59.003 回答
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
于 2015-06-25T15:12:25.557 回答
1

来自 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) 不涉及在命令行上打印密码。

于 2016-06-26T06:22:30.590 回答
0
{ echo $password; echo $password; } | passwd $username 
于 2015-02-07T12:48:35.550 回答
0

对于 RedHat / CentOS,这是创建用户、添加密码并使用户成为 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
于 2016-12-19T13:15:52.750 回答
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;
于 2017-03-15T02:42:00.763 回答