从CSV文件导入用户

是否可以使用CSV文件导入用户? 或类似LDAP连接导入所有用户?

有一个应用程序! 作为passwd包的一部分的newusers工具旨在批量创建用户:

 DESCRIPTION The newusers command reads a file (or the standard input by default) and uses this information to update a set of existing users or to create new users. Each line is in the same format as the standard password file (see passwd(5)) with the exceptions explained below: 

您需要使用以下格式创建文件:

 username:passwd:UID:GID:full name,room number,work phone,home phone,other:directory:shell 

其中许多可以忽略,并使用默认值。 您只需指定用户名和密码即可。 例如:

 tom:password1::::: danny:password2::::: 

如果我将其保存为users.txt并运行此命令:

 sudo newusers < users.txt 

用户已创建:

 $ grep -E 'tom|danny' /etc/passwd tom:x:1005:1006::: danny:x:1006:1007::: 

用脚本就可以了。 这需要一个用户和密码commaseparated的文件:

 while IFS="," read -r user passwd ; do echo "useradd -m -p $(mkpasswd "$passwd") $user" done < /home/$USER/Downloads/users.txt 
  • 可以使用sudo apt-get install whois安装mkpasswd
  • 改变,到; 如果你需要那个。

将其另存为users.sh并使用chmod +x users.sh设置权限

如果你这样做

 ./users.sh > users_create.sh 

您将获得包含所有命令的文本文件,以便您可以对其进行validation

 chmod +x users.sh ./users_create.sh 

然后会创建它们。


测试

示例文件:

 wdn,password123 wdn2,password345 

在“〜/ Downloads”中保存为“users.txt”。

执行脚本:

 ./users.sh useradd -m -p acBNi2tbw9iaw wdn useradd -m -p OHOzeMGqbcMso wdn2 

 ./users.sh > users_create.sh ~/Downloads$ more users_create.sh useradd -m -p Q1BVotdoA3ucI wdn useradd -m -p siUX7mYTYw.3A wdn2 

(密码已加密)。

在此之后,您需要做的就是使用chmod +x users.sh生成此可执行文件并使用chmod +x users.sh执行它(我最后没有这样做,所以如果不工作请注释)。

这是一个awk单行:

sudo awk -F',' '{ command="useradd -p $( mkpasswd "$2" ) "$1;print command; system(command) }' userlist.txt

或者为了便于阅读,这里是格式:

 sudo awk -F',' '{ command="useradd -p $(mkpasswd "$2 ")" $1; print command; system(command) }' userlist.txt 

说明

当awk处理来自文本文件的条目时,awk的system函数允许运行shell命令。 我们创建一个变量“命令”,它只是我们想要运行的命令的文本。 使用逗号作为字段分隔符-F',' ,我们取字段#2和#1并将它们放置以匹配useradd命令的语法。 一旦组装了命令文本,system(命令)就为文本的每一行执行useradd -p $(mkpasswd password) usernameprint command部分是可选的,仅用于调试和validation是否已处理所有用户名

加成:

oneliner可以像这样变成一个awk脚本:

 #!/usr/bin/awk -f BEGIN {FS=",";} { command="useradd -p $(mkpasswd "$2") " $1; print command; system( command ) } 

现在确保脚本具有sudo chmod +x script-name.awk可执行权限,并使用任何输入文件运行它,如sudo ./awkscript.sh userlist.txt如果它在您当前的工作目录中,或者您可以调用它将脚本放入$PATH目录之一的任何地方

可能,在密码中

考虑到在密码中使用逗号的可能性,我建议你使用sub()函数。 子函数更改每行中字符或单词的第一个实例。 换句话说,如果我们有一个条目,如testuser,foo,bar ,其中foo,bar是密码,并且我们将第一个条目更改为空格,我们可以正常使用awk,而不会告诉它使用-F',' flag。 awk会将每个条目翻译为testuser foo,bar ,并将testuser视为$ 1和foo,bar为$ 2。 把它放到代码中:

sudo awk '{ sub(","," ");command="useradd -p $( mkpasswd "$2" ) "$1;print command; system(command) }' userlist.txt

这是一个python解决方案:

 #!/usr/bin/env python2 import subprocess, crypt with open('/path/to/file.csv') as f: for line in f: i = line.find(',') name = line[:i] password = line.rstrip()[i+1:] encpt_passwd = crypt.crypt(password, '2b') command = 'useradd -m -p {0} {1}'.format(encpt_passwd, name).split() subprocess.call(command) 

这将处理带有逗号的密码。

  • line.find(',')将在文件的每一行中找到最低索引

  • line[:i]将占用包含用户名的行的片段

  • line.rstrip()[i+1:]将包含密码

  • crypt模块从crypt.crypt(password, salt)forms的输入生成加密密码。 encpt_passwd将包含加密密码。 在crypt.crypt(password, '2b')password是保存的普通密码, 2b是salt。

  • subprocess.call(command)将只运行命令来生成用户

我有一个较短的awk版本(@Serg =)):

首先安装whois ,我们需要命令mkpasswd

 sudo apt-get install whois 

比你可以使用这个oneliner:

 awk -F',' '{print "Create user: "$1; system("sudo useradd -p $(mkpasswd "$2") "$1)}' users 

或没有任何输出:

 awk -F',' '{system("sudo useradd -p $(mkpasswd "$2") "$1)}' users 

users内容:

 foo,foopasswd bar,password foobar,foobar 

用户名在第一列中,第二列中是未加密的密码。


公平地说,我在这里提到了一个问题。 密码不能包含逗号。

我的AWK版本在密码中有问题。 这是我的perl版本:

 #!/usr/bin/perl use strict; use warnings; use Text::CSV; my $file = $ARGV[0]; open my $fh, "<", $file or die "$file: $!"; my $csv = Text::CSV->new ({ binary => 1, # Allow special character. Always set this auto_diag => 1, # Report irregularities immediately sep_char => ',' }); while (my $row = $csv->getline ($fh)) { print "User: ".$row->[0]."\n"; print "Password: ".$row->[1]."\n"; my $hashed = crypt($row->[1], "salt"); my $cmd = 'useradd -p '.$hashed.' '.$row->[0]."\n"; system($cmd); } close $fh; 

例:

CSV文件users.csv

 foo,"foopasswd" bar,"password" foobar,"""foo,bar" 

启动脚本

 % sudo add_users users.csv User: foo Password: foopasswd useradd -p sajllSNct/Wx2 foo User: bar Password: password useradd -p sa3tHJ3/KuYvI bar User: foobar Password: "foo,bar useradd -p saBWMpscG9WvA foobar