1 votes

Comment puis-je extraire les données d'un utilisateur d'un fichier avec awk et créer un nouvel utilisateur sur la base de ces données ?

J'ai besoin de quelqu'un qui pourrait m'aider à faire un exercice. Je ne peux que utiliser des scripts Shell et awk pour le faire :

Vous disposez d'un fichier texte appelé users.txt contenant ces informations :

users.txt :

Peter:7777:/home/store ;

Quinn:7777:/home/accounts ;

David:7777:/home/secondstore ;

Daniel:7777:/home/adresse ;

Le script doit créer un utilisateur en utilisant le premier mot de chaque ligne, le deuxième mot de chaque ligne sera utilisé comme mot de passe, et le troisième comme répertoire personnel.

Je serais très reconnaissant si quelqu'un pouvait m'indiquer la bonne direction.

3voto

awk -F: '{print $1}' users.txt vous donnera accès au champ du nom d'utilisateur
awk -F: '{print $2}' users.txt --> champ mot de passe
awk -F: '{print $3}' users.txt --> champ du répertoire personnel

vous pourriez faire quelque chose comme :

user=`awk -F: '{print $1}' users.txt`;
path=`awk -F: '{print $3}' users.txt`;
useradd -d $path -m $user;

2voto

Mufaka Points 54

Les deux commandes de la boucle while doivent être exécutées en tant qu'utilisateur root. sudo ou sauvegarder ceci comme un script bash et l'exécuter avec sudo (probablement préférable).

awk -F ':| ' '{print $1, $2, $3}' users.txt |
while read user password homedir; do
    adduser --home "$homedir" "$user"
    echo "$password" | passwd "$user" --stdin
done

Par ailleurs, comme vous l'avez souligné, vous pouvez faire plus à l'intérieur. awk . Nous pouvons faire en sorte qu'il imprime la totalité de la commande :

$ awk -F ':| ' '{ print("adduser --home", $3, $1"; echo", $2 " | passwd", $1) }' users.txt
adduser --home /home/almacen1 Jperez; echo 1234 | passwd Jperez
adduser --home /home/contabilidad1 Lgomez; echo 1234 | passwd Lgomez
adduser --home /home/almacen2 Pfernandez; echo 1234 | passwd Pfernandez
adduser --home /home/direccion1 Mramos; echo 1234 | passwd Mramos

Ensuite, il suffit d'envoyer tout cela dans un Shell (en cours d'exécution) :

$ awk -F ':| ' '{ print("adduser --home", $3, $1"; echo", $2 " | passwd", $1) | "/bin/bash" }' users.txt
adduser: Only root may add a user or group to the system.
passwd: user 'Jperez' does not exist
adduser: Only root may add a user or group to the system.
passwd: user 'Lgomez' does not exist
adduser: Only root may add a user or group to the system.
passwd: user 'Pfernandez' does not exist
adduser: Only root may add a user or group to the system.
passwd: user 'Mramos' does not exist

Il est évident qu'il faut exécuter la procédure ci-dessus avec sudo (ou en tant que root) pour qu'il puisse fonctionner (c'est pourquoi il vomit des erreurs). Vous pouvez utiliser awk 's system() mais il faut alors passer plus de temps à concaténer les chaînes. print() simplifie vraiment les choses, c'est pourquoi j'ai opté pour cette solution.

Pour plus de clarté, je veux dire par là qu'il s'agit d'exécuter sudo awk -F ':| ' '{ print("adduser --home", $3, $1"; echo", $2 " | passwd", $1) | "/bin/bash" }' users.txt

1voto

Edward Chase Points 3

Définissez le séparateur de champ interne à : et ignorez simplement le dernier caractère de ; par n'importe quelle méthode... en utilisant la sous-chaîne ou en l'écrasant.

Ce code devrait vous mettre sur la bonne voie.

Voici un exemple aléatoire d'IFS var en cours d'utilisation

#!/bin/bash
IFS=$','
vals='/mnt,/var/lib/vmware/Virtual Machines,/dev,/proc,/sys,/tmp,/usr/portage,/var/tmp'
for i in $vals; do echo $i; done
unset IFS

Dans votre cas, vous devez définir IFS= : et exécuter ce type de code sur chaque ligne.

Pour ce genre de questions, je recommande d'utiliser un moteur de recherche ou de poster sur un site plus convivial pour les programmeurs.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X