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

Mod*_*try 187 linux bash passwd

我需要能够在我的Linux(Fedora 10)上创建用户帐户,并通过bash脚本自动分配密码(如果需要,可以自动分配密码).

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

[whoever@server ]#  /usr/sbin/useradd newuser
Run Code Online (Sandbox Code Playgroud)

是否可以在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 ]#
Run Code Online (Sandbox Code Playgroud)

小智 189

你也可以使用chpasswd:

echo username:new_password | chpasswd
Run Code Online (Sandbox Code Playgroud)

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

  • +1,这是工作的正确工具:`$ apropos chpasswd` ...`chpasswd(8) - 以批处理模式更新密码 (5认同)

小智 115

您可以运行passwd命令并将其发送到管道输入.所以,做一些像:

echo thePassword | passwd theUsername --stdin
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于ubuntu 12.04或debian 6.0.5. (29认同)
  • --stdin在较新的Linux系统中已被弃用.请改用chpasswd. (28认同)
  • @MarkusOrreilly可以使用,但是在使用像Ansible这样的配置工具时却没有.正如@Nybble所说,你应该使用chpasswd.所以这是有效的:`echo'myuser:mypass'| chpasswd`.希望有所帮助. (15认同)
  • 我不得不做`echo -e"密码\npassword \n"| passwd`于13.04 (8认同)
  • 该方法的好处是它是安全的(假设`echo`是在使用的shell中内置的,它通常是),至少关于`/ proc /`. (3认同)
  • 我很惊讶没有人提到 passwd 没有让这变得容易的原因:这种方法会将新密码直接放入 shell 历史记录中,除非采取措施来防止这种情况发生。任何致力于走这条路的人都应该牢记这一点。 (3认同)

Dam*_*ien 76

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

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

useradd -p $(openssl passwd -1 $PASS) $USER
Run Code Online (Sandbox Code Playgroud)

  • `useradd -p $(openssl passwd -1 $ PASS)$ USER`更现代,因为反向标记被弃用,建议使用`$()`. (23认同)
  • `useradd -m -p <password> -s /bin/bash <user>`, -m Crates 主目录,-s 指定用户默认 shell,根据你的需要替换 `password` 和 `user`。 (3认同)
  • 你也可以加密密码:`useradd -m -p $(openssl passwd -1 -salt $ SALT $ PASS)`.我认为这在以后的Ubuntu上是必需的. (2认同)

Yin*_*ing 51

下面的代码在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
Run Code Online (Sandbox Code Playgroud)

  • http://en.wikipedia.org/wiki/Gecos_field gecos字段或GECOS字段是Unix上/ etc/passwd文件中的条目,以及类似的操作系统.它通常用于记录有关帐户或其用户的一般信息,例如他们的真实姓名和电话号码.GECOS指通用电气综合操作系统,当GE的大型系统部门出售给霍尼韦尔时,该系统已更名为GCOS. (10认同)
  • 我不明白`--gecos` (3认同)

Pau*_*l S 29

我喜欢Tralemonkey的方法echo thePassword | passwd theUsername --stdin虽然它对我来说并不像我所写的那样.这对我有用.

echo -e "$password\n$password\n" | sudo passwd $user
Run Code Online (Sandbox Code Playgroud)

-e是承认\n新线.

sudo 是Ubuntu的root访问权限.

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

上面的命令将密码和新行传递两次passwd,这就是passwd需要的.

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

echo -e 'password\npassword\n' | sudo passwd username
Run Code Online (Sandbox Code Playgroud)

单引号应该足够了.

  • 在bash中精美地工作.但是,如果在sh中运行,则-e选项不起作用.我发现它实际输出"-e"的困难方式.幸运的是,-e选项在sh中是不必要的,转义是默认的.便携版本是使用printf"password \npassword \n"| ......而是. (2认同)

cev*_*ris 23

以下适用于我,并在Ubuntu 14.04上进行了测试.它是一个不需要任何用户输入的单线程.

sudo useradd -p $(openssl passwd -1 $PASS) $USERNAME
Run Code Online (Sandbox Code Playgroud)

取自@Tralemonkey

  • 这对我来说也适用于Dockerfile. (3认同)

R S*_*hko 13

您可以使用-p选项.

useradd -p encrypted_password newuser
Run Code Online (Sandbox Code Playgroud)

不幸的是,这确实需要您自己散列密码(passwd会为您执行此操作).不幸的是,似乎没有标准实用程序来散列某些数据,因此您必须自己编写.

这是一个Python脚本,我掀起来为你做加密.假设您将其命名为pcrypt,那么您可以将上面的命令行写入:

useradd -p $(pcrypt ${passwd}) newuser
Run Code Online (Sandbox Code Playgroud)

需要注意的几个警告.

  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),))
Run Code Online (Sandbox Code Playgroud)

  • perl -e'print crypt($ ARGV [0],"password")''mypassword' (5认同)

San*_*eep 9

单线程用于创建具有主目录和密码的sudo用户.

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


Rog*_*ger 7

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

`passwd: unrecognized option '--stdin'`
Run Code Online (Sandbox Code Playgroud)

这对我有用:

#useradd $USER
#echo "$USER:$SENHA" | chpasswd
Run Code Online (Sandbox Code Playgroud)

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


Car*_*ada 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"
Run Code Online (Sandbox Code Playgroud)


Jei*_*ght 5

我知道我是在这一年之后来的,但我不敢相信没有人建议使用 usermod。

usermod --password `perl -e "print crypt('password','sa');"` root
Run Code Online (Sandbox Code Playgroud)

见鬼,万一有人想在较旧的 HPUX 上执行此操作,您可以使用usermod.sam.

/usr/sam/lbin/usermod.sam -F -p `perl -e "print crypt('password','sa');"` username
Run Code Online (Sandbox Code Playgroud)

-F 仅当执行脚本的人是当前用户时才需要。当然,您不需要使用 Perl 来创建哈希。您可以在其位置使用 openssl 或许多其他命令。


小智 5

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

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

对于 CentOS

echo "$new_password" | passwd --stdin "$new_username"
Run Code Online (Sandbox Code Playgroud)

对于 Debian/Ubuntu

echo "$new_username:$new_password" | chpasswd
Run Code Online (Sandbox Code Playgroud)

对于 OpenSUSE

echo -e "$new_password\n$new_password" | passwd "$new_username"
Run Code Online (Sandbox Code Playgroud)