Importar usuários do arquivo CSV

4

É possível importar usuários usando o arquivo CSV? ou algo parecido com uma conexão LDAP para importar todos os usuários?

    
por Driekus 08.06.2015 / 11:23

6 respostas

12

Há um aplicativo para isso! A ferramenta newusers , que faz parte do pacote passwd , foi projetada para criar usuários em lote:

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:

Você precisará criar um arquivo com este formato:

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

Muitos destes podem ser ignorados e os valores padrão serão usados. Você apenas precisa para especificar o nome de usuário e a senha. Por exemplo:

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

Se eu salvar isso como users.txt e executar este comando:

sudo newusers < users.txt 

Os usuários são criados:

$ grep -E 'tom|danny' /etc/passwd
tom:x:1005:1006:::
danny:x:1006:1007:::
    
por terdon 08.06.2015 / 14:13
8

Com um script, você pode. Isso precisa de um arquivo com usuário e senha separados:

while IFS="," read -r user passwd ; do      
        echo "useradd -m -p $(mkpasswd "$passwd") $user"
done < /home/$USER/Downloads/users.txt
  • mkpasswd pode ser instalado com sudo apt-get install whois
  • Altere o para um; se você precisar disso.

Salvar como users.sh e definir permissões com chmod +x users.sh

Se você, então, fizer

./users.sh > users_create.sh

Você recebe um arquivo de texto com todos os comandos para poder verificá-lo e

chmod +x users.sh
./users_create.sh

irá então criá-los.

Teste

Arquivo de exemplo:

wdn,password123 
wdn2,password345

salvo como "users.txt" em "~ / Downloads".

Executar script:

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

e

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

(senha criptografada).

Depois disso, tudo que você precisa fazer é executar este executável com chmod +x users.sh e executá-lo com ./users_create.sh (eu não fiz esse último bit, portanto, se não estiver funcionando, por favor comente).

    
por Rinzwind 08.06.2015 / 11:39
6

Aqui está um one-liner awk:

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

Ou para facilitar a leitura, aqui está o formato:

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

Explicação :

A função system do awk permite executar comandos do shell enquanto o awk está processando entradas do arquivo de texto. Criamos uma variável "comando" que é apenas o texto do comando que queremos executar. Usando vírgula como separador de campo -F',' , pegamos os campos # 2 e # 1 e os colocamos para corresponder à sintaxe do comando useradd. Uma vez que o texto do comando é montado, o sistema (comando) executa useradd -p $(mkpasswd password) username , para cada linha do texto. print command part é opcional, meramente para depuração e verificação de que todos os nomes de usuários foram processados

Adição:

O oneliner pode ser transformado em um script awk da seguinte forma:

#!/usr/bin/awk -f


BEGIN {FS=",";}

{ 
     command="useradd -p $(mkpasswd "") " ; 
     print command; 
    system( command )
}

Agora, verifique se o script tem permissões executáveis com sudo chmod +x script-name.awk e execute-o com qualquer arquivo de entrada, como sudo ./awkscript.sh userlist.txt , se estiver em seu diretório de trabalho atual, ou chame esse script em qualquer lugar, colocando-o em um dos $PATH diretórios

Possível , na senha

Para levar em conta a possibilidade de ter vírgula na senha, sugiro que você use a função sub() . A subfunção altera a primeira instância de um caractere ou palavra em cada linha. Em outras palavras, se tivermos uma entrada como testuser,foo,bar , onde foo,bar for senha e alterarmos a primeira entrada para o espaço, podemos usar o awk normalmente, sem avisá-lo para usar -F',' flag. O awk irá traduzir cada entrada para testuser foo,bar , e tratará testuser como $ 1 e foo, como $ 2. Para colocar isso no código:

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

    
por Sergiy Kolodyazhnyy 08.06.2015 / 13:09
5

Aqui está uma solução 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)

Isso processará senhas com vírgulas.

  • line.find(',') encontrará o menor índice de , em cada linha do arquivo

  • line[:i] terá a fatia da linha que contém o nome de usuário

  • line.rstrip()[i+1:] conterá a senha

  • crypt module gera senha criptografada da entrada do formulário crypt.crypt(password, salt) . encpt_passwd conterá a senha criptografada. Em crypt.crypt(password, '2b') , password é a senha simples salva e 2b é o sal.

  • subprocess.call(command) simplesmente executará o comando para gerar usuários

por heemayl 08.06.2015 / 21:56
2

Eu tenho uma versão awk mais curta (@Serg =)):

Primeiro instale whois , precisamos do comando mkpasswd

sudo apt-get install whois

Do que você pode usar este oneliner:

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

ou sem qualquer saída:

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

Conteúdo de users :

foo,foopasswd
bar,password
foobar,foobar

O nome do usuário está na primeira coluna, a senha não criptografada na segunda coluna.

Para ser justo, eu menciono um problema aqui. As senhas não podem incluir uma vírgula.

    
por A.B. 08.06.2015 / 14:34
1

Minha versão do AWK tem um problema com , na senha. Aqui está a minha versão em 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;

Exemplo:

Arquivo CSV users.csv :

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

Inicie o script

% 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
    
por A.B. 08.06.2015 / 21:14