Est-il possible d'importer des utilisateurs en utilisant un fichier CSV? ou quelque chose comme une connexion LDAP pour importer tous les utilisateurs?
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:::
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
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).
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
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
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.
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