web-dev-qa-db-fra.com

Importer des utilisateurs à partir d'un fichier CSV

Est-il possible d'importer des utilisateurs en utilisant un fichier CSV? ou quelque chose comme une connexion LDAP pour importer tous les utilisateurs?

5
Driekus

Il y a une application pour ça! L'outil newusers qui fait partie du package passwd est conçu pour créer par lots des utilisateurs:

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:

Vous devrez créer un fichier avec ce format:

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

Beaucoup d’entre eux peuvent être ignorés et les valeurs par défaut seront utilisées. Vous n'avez que besoin pour spécifier le nom d'utilisateur et le mot de passe. Par exemple:

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

Si je sauvegarde cela en tant que users.txt et exécute cette commande:

Sudo newusers < users.txt 

Les utilisateurs sont créés:

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

Avec un script, vous pouvez. Cela nécessite un fichier avec un utilisateur et un mot de passe séparés par des virgules:

while IFS="," read -r user passwd ; do      
        echo "useradd -m -p $(mkpasswd "$passwd") $user"
done < /home/$USER/Downloads/users.txt
  • mkpasswd peut être installé avec Sudo apt-get install whois
  • Changer le, en un; si vous en avez besoin.

Enregistrez ceci sous users.sh et définissez les autorisations avec chmod +x users.sh.

Si vous faites alors

./users.sh > users_create.sh

Vous obtenez un fichier texte avec toutes les commandes afin que vous puissiez le vérifier et

chmod +x users.sh
./users_create.sh

va ensuite les créer.


Test

Exemple de fichier:

wdn,password123 
wdn2,password345

enregistré en tant que "users.txt" dans "~/Téléchargements".

Exécuter le script:

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

et

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

(mot de passe sont cryptés).

Après cela, tout ce que vous avez à faire est d’exécuter, c’est de créer cet exécutable avec chmod +x users.sh et de l’exécuter avec ./users_create.sh (je n’ai pas fait le dernier bit, donc, si cela ne fonctionne pas, veuillez commenter).

8
Rinzwind

Voici une solution 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)

Cela gérera les mots de passe comportant des virgules.

  • line.find(',') trouvera l'indice le plus bas de , dans chaque ligne du fichier.

  • line[:i] prendra la tranche de la ligne contenant le nom d'utilisateur

  • line.rstrip()[i+1:] contiendra le mot de passe

  • Le module crypt génère un mot de passe crypté à partir de la forme crypt.crypt(password, salt). encpt_passwd contiendra le mot de passe crypté. Dans crypt.crypt(password, '2b'), password est le mot de passe simple enregistré et 2b est le sel.

  • subprocess.call(command) exécutera simplement la commande pour générer des utilisateurs

6
heemayl

Voici un awk one-liner:

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

Ou pour la lisibilité, voici le format:

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

Explication:

la fonction system de awk permet d'exécuter des commandes de shell pendant que awk traite les entrées à partir d'un fichier texte. Nous créons une variable "commande" qui est simplement le texte de la commande que nous voulons exécuter. En utilisant une virgule comme séparateur de champ _-F','_, nous prenons les champs n ° 2 et n ° 1 et nous les plaçons pour correspondre à la syntaxe de la commande useradd. Une fois que le texte de la commande est assemblé, system (commande) exécute useradd -p $(mkpasswd password) username pour chaque ligne du texte. La partie _print command_ est facultative. Elle sert uniquement à déboguer et à vérifier que tous les noms d'utilisateur ont été traités.

Ajout:

Oneliner peut être transformé en un script awk comme ceci:

_#!/usr/bin/awk -f


BEGIN {FS=",";}

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

Maintenant, assurez-vous que le script a des autorisations exécutables avec _Sudo chmod +x script-name.awk_ et exécutez-le avec n’importe quel fichier d’entrée tel que so _Sudo ./awkscript.sh userlist.txt_ s’il se trouve dans votre répertoire de travail actuel. Sinon, vous pouvez appeler ce script n’importe où en le plaçant dans l’un des fichiers suivants: les répertoires _$PATH_

possible _,_ dans le mot de passe

Pour prendre en compte la possibilité d'avoir une virgule dans le mot de passe, je vous suggère d'utiliser la fonction sub(). La sous-fonction change la première instance d'un caractère ou d'un mot dans chaque ligne. En d'autres termes, si nous avons une entrée telle que _testuser,foo,bar_, où _foo,bar_ est le mot de passe et que nous modifions la première entrée en espace, nous pouvons utiliser awk normalement, sans lui dire d'utiliser _-F','_ drapeau. Awk traduira chaque entrée en _testuser foo,bar_ et traitera testuser en tant que $ 1 et foo, bar en tant que $ 2. Pour mettre cela dans le code:

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

6

J'ai une version plus courte de awk (@Serg =)):

D'abord installer whois, nous avons besoin de la commande mkpasswd

Sudo apt-get install whois

Alors vous pouvez utiliser cet oneliner:

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

ou sans aucune sortie:

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

Contenu de users:

foo,foopasswd
bar,password
foobar,foobar

Le nom d'utilisateur est dans la première colonne, le mot de passe non chiffré dans la 2ème colonne.


En toute justice, je mentionne un problème ici. Les mots de passe ne peuvent pas inclure une virgule.

2
A.B.

Ma version AWK a un problème avec , dans le mot de passe. Voici ma version de 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;

Exemple:

Fichier CSV users.csv:

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

Lancer le 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
1
A.B.