从 CSV 文件导入用户

Dri*_*kus 7 users user-management csv

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

ter*_*don 14

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

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

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

username:passwd:UID:GID:full name,room number,work phone,home phone,other:directory:shell
Run Code Online (Sandbox Code Playgroud)

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

tom:password1:::::
danny:password2:::::
Run Code Online (Sandbox Code Playgroud)

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

sudo newusers < users.txt 
Run Code Online (Sandbox Code Playgroud)

创建用户:

$ grep -E 'tom|danny' /etc/passwd
tom:x:1005:1006:::
danny:x:1006:1007:::
Run Code Online (Sandbox Code Playgroud)


Rin*_*ind 9

用脚本就可以。这需要一个用户和密码以逗号分隔的文件:

while IFS="," read -r user passwd ; do      
        echo "useradd -m -p $(mkpasswd "$passwd") $user"
done < /home/$USER/Downloads/users.txt
Run Code Online (Sandbox Code Playgroud)
  • mkpasswd 可以安装 sudo apt-get install whois
  • 将 , 更改为 ; 如果你需要的话。

将此另存为users.sh并设置权限chmod +x users.sh

如果你那么做

./users.sh > users_create.sh
Run Code Online (Sandbox Code Playgroud)

你会得到一个包含所有命令的文本文件,以便你可以验证它并

chmod +x users.sh
./users_create.sh
Run Code Online (Sandbox Code Playgroud)

然后将创建它们。


测试

示例文件:

wdn,password123 
wdn2,password345
Run Code Online (Sandbox Code Playgroud)

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

执行脚本:

./users.sh 
useradd -m -p acBNi2tbw9iaw wdn
useradd -m -p OHOzeMGqbcMso wdn2
Run Code Online (Sandbox Code Playgroud)

./users.sh  > users_create.sh
~/Downloads$ more users_create.sh 
useradd -m -p Q1BVotdoA3ucI wdn
useradd -m -p siUX7mYTYw.3A wdn2
Run Code Online (Sandbox Code Playgroud)

(密码已加密)。

在这之后你需要做的就是执行这个可执行文件chmod +x users.sh并执行它./users_create.sh(我没有做最后一点,所以如果不起作用请评论)。

  • `for users in $(cat file)` 不是在文件中循环的最佳方式。相反,只需使用 `while IFS="," read -r user passwd ; 做 ... ; 完成&lt;文件`。`$user` 和 `$passwd` 将包含第一和第二列等。 (2认同)

Ser*_*nyy 6

这是一个 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
Run Code Online (Sandbox Code Playgroud)

说明

awk 的system函数允许在 awk 处理文本文件中的条目时运行 shell 命令。我们创建了一个变量“命令”,它只是我们想要运行的命令的文本。使用逗号作为字段分隔符-F',',我们将字段 #2 和 #1 放置到匹配 useradd 命令的语法中。一旦汇编了命令的文本, system(command)useradd -p $(mkpasswd password) username将针对文本的每一行执行。print command部分是可选的,仅用于调试和验证是否已处理所有用户名

添加:

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

#!/usr/bin/awk -f


BEGIN {FS=",";}

{ 
     command="useradd -p $(mkpasswd "$2") " $1; 
     print command; 
    system( command )
}
Run Code Online (Sandbox Code Playgroud)

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

可能,在密码中

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

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


hee*_*ayl 6

这是一个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)
Run Code Online (Sandbox Code Playgroud)

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

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

  • line[:i] 将获取包含用户名的行的切片

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

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

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