#1 Le 30/05/2016, à 13:55
- Sublimatique
[Résolu] Shell - Copier des lignes dans un fichier
Bonjour tout le monde,
Je suis en entreprise et j'ai vraiment un petit niveau en shell et je dois ajouter à la fin du ficher "/etc/group" des lignes contenant des users.
Je m'explique, j'ai d'un côté le fichier /etc/group qui est présenté comme ceci :
wireshark:x:128:toto
Et de l'autre côté j'ai un fichier users.txt, dans ce fichier chaque ligne comprend un username, exemple :
user1
user2
user3
Je voudrais pouvoir via un script shell ajouter en fin du fichier /etc/group ma liste d'users de users.txt sous cette forme :
wireshark:x:128:toto
wireshark:x:128:user1
wireshark:x:128:user2
wireshark:x:128:user3
Il faudrait que les 3 lignes s'ajoutent à la suite les unes des autres et à la suite de wireshark:x:128:toto.
J'ai commencer un script qui n'est pas fini et je pense être sur la bonne voie, des conseils ou idées ?
#!/bin/bash
nblignes=0
nblignes= sed -n '$=' users.txt
compteur=0
while compteur!=nblignes
do
echo "wireshark:x:130:$user" > /etc/group
done
echo $user
Merci d'avance
Dernière modification par Sublimatique (Le 01/06/2016, à 16:02)
Hors ligne
#2 Le 30/05/2016, à 14:20
- gl38
Re : [Résolu] Shell - Copier des lignes dans un fichier
Si tu utilises > tout seul tu vas écraser le fichier /etc/group, il faut mettre >> pour écrire à la fin.
Mais si tu débutes en shell, ce n'est vraiment pas une bonne idée de procéder comme cela, tu perdras moins de temps à réparer les dégâts en faisant chaque insertion en utilisant les outils d’administration du système.
Cordialement,
Guy
Hors ligne
#3 Le 30/05/2016, à 14:23
- pingouinux
Re : [Résolu] Shell - Copier des lignes dans un fichier
Bonjour,
Si tu es certain de ce que tu veux faire, voici une manière prudente de procéder :
sudo cp -p /etc/group /etc/group.old
cp /etc/group /tmp/fichier_test
while read user
do
echo "wireshark:x:128:$user" >>/tmp/fichier_test
done <users.txt
Tu vérifies ensuite /tmp/fichier_test. Si c'est correct, tu remplaces ensuite
echo "wireshark:x:128:$user" >>/tmp/fichier_test
par
sudo echo "wireshark:x:128:$user" >>/etc/group
Attention :
J'ai vérifié chez moi, et tous les numéros dans /etc/group sont différents (ainsi que les noms dans la première colonne).
Dernière modification par pingouinux (Le 30/05/2016, à 14:27)
Hors ligne
#4 Le 30/05/2016, à 14:49
- gl38
Re : [Résolu] Shell - Copier des lignes dans un fichier
Chez moi aussi il y a une ligne par groupe, mais sur la ligne d'un groupe on peut mettre une liste d'utilisateurs séparés par des virgules.
Cordialement,
Guy
Hors ligne
#5 Le 30/05/2016, à 15:02
- Sublimatique
Re : [Résolu] Shell - Copier des lignes dans un fichier
Oui chez moi aussi les numéros sont différents, je vais essayer ta méthode pingouinux et je te tiens au courant.
gl38, comment faire pour mettre tout les users automatiquement à la suite les uns des autres séparés par une virgule avec le script ?
Hors ligne
#6 Le 30/05/2016, à 15:06
- gl38
Re : [Résolu] Shell - Copier des lignes dans un fichier
Pourquoi faire des scripts qui vont planter le système ? Il y a la commande addgroup.
Cordialement,
Guy
Hors ligne
#7 Le 30/05/2016, à 15:19
- Sublimatique
Re : [Résolu] Shell - Copier des lignes dans un fichier
La commande addgroup est parfaite mais comment faire pour l'utiliser sur une liste d'utilisateurs stockés dans un fichier .txt ?
J'ai essayé ton code pingouinux mais j'ai cette erreur en retour :
root@ibgbi-OptiPlex-7010:~/Documents/Script Addgroup Wireshark# ./script1.sh
./script1.sh: ligne 7: erreur de syntaxe près du symbole inattendu « done »
'/script1.sh: ligne 7: `done << users.txt
Hors ligne
#8 Le 30/05/2016, à 15:57
- pingouinux
Re : [Résolu] Shell - Copier des lignes dans un fichier
Parce que c'est
done <users.txt
Hors ligne
#9 Le 30/05/2016, à 16:02
- Sublimatique
Re : [Résolu] Shell - Copier des lignes dans un fichier
J'ai ce code là :
GNU nano 2.5.3 Fichier : script1.sh
#/bin/sh
cp -p /etc/group /etc/group.old
cp /etc/group /tmp/fichier_test
while read users
do
echo "wireshark:x:128:$user" >>/tmp/fichier_test
done <users1.txt
Mais ubuntu ne veut rien savoir :
root@ibgbi-OptiPlex-7010:~/Documents/Script Addgroup Wireshark# ./script1.sh
./script1.sh: ligne 7: erreur de syntaxe près du symbole inattendu « done »
'/script1.sh: ligne 7: `done <users1.txt
Aussi la ligne
while read users
me semble bizzare, le while read users est bien mais il va lire quoi ? Le fichier users.txt n'est pas renseigner dans le programme
Hors ligne
#10 Le 30/05/2016, à 16:13
- Sublimatique
Re : [Résolu] Shell - Copier des lignes dans un fichier
Perso j'en suis là de mon côté, je trouve que le script commence à prendre forme non
#/bin/sh
nblignes=$(sed -n '$=' users.txt)
compteur=0
#echo $nblignes ***Affiche 2***
while [ compteur -ne nblignes ];
do
user=sed -n '$compteur' users.txt
echo "wireshark:x:130:$user">>/tmp/fichier_test
echo $user
compteur=compteur+1
done
Mais j'ai des erreurs d’exécution comme :
root@ibgbi-OptiPlex-7010:~/Documents/Script Addgroup Wireshark# ./wireshark.sh
./wireshark.sh: ligne 5: $'\r' : commande introuvable
./wireshark.sh: ligne 13: erreur de syntaxe : fin de fichier prématurée
Hors ligne
#11 Le 30/05/2016, à 16:24
- Compte anonymisé
Re : [Résolu] Shell - Copier des lignes dans un fichier
sinon quelque chose comme ça ?
sed -r 's/(.*)/wireshark:x:130:\1/' users.txt >> /tmp/fichier_test
#12 Le 30/05/2016, à 16:29
- pingouinux
Re : [Résolu] Shell - Copier des lignes dans un fichier
La première ligne doit être
#!/bin/sh
ou
#!/bin/bash
Cette commande n'est à exécuter qu'une seule fois, même si tu relances le script. C'est une sauvegarde du fichier /etc/group
cp -p /etc/group /etc/group.old
C'est user et non users (en relation avec $user, 2 lignes plus bas)
while read user
Ton fichier users.txt doit être situé dans le répertoire d'où tu lances le script
'/script1.sh: ligne 7: `done <users1.txt
N'y a-t-il pas un caractère en trop avant le done ?
Si tu n'es pas sûr de ce que tu fais, ne touche pas au fichier /etc/group.
Dernière modification par pingouinux (Le 30/05/2016, à 16:32)
Hors ligne
#13 Le 30/05/2016, à 17:47
- gl38
Re : [Résolu] Shell - Copier des lignes dans un fichier
Il y a combien de lignes dans ce fichier users.txt ?
Cordialement,
Guy
Hors ligne
#14 Le 31/05/2016, à 07:29
- gl38
Re : [Résolu] Shell - Copier des lignes dans un fichier
Pourquoi ne pas remplacer
echo "wireshark:x:128:$user" >>/tmp/fichier_test
par
sudo adduser $user wireshark
L'idée d'écrire directement dans /etc/group me semble désastreuse.
Cordialement,
Guy
Hors ligne
#15 Le 31/05/2016, à 15:59
- Sublimatique
Re : [Résolu] Shell - Copier des lignes dans un fichier
La première ligne doit être
#!/bin/sh
ou
#!/bin/bash
Cette commande n'est à exécuter qu'une seule fois, même si tu relances le script. C'est une sauvegarde du fichier /etc/group
cp -p /etc/group /etc/group.old
C'est user et non users (en relation avec $user, 2 lignes plus bas)
while read user
Ton fichier users.txt doit être situé dans le répertoire d'où tu lances le script
'/script1.sh: ligne 7: `done <users1.txt
N'y a-t-il pas un caractère en trop avant le done ?
Si tu n'es pas sûr de ce que tu fais, ne touche pas au fichier /etc/group.
Voici mon code et je ne vois pas d'erreur
#/bin/sh
cp -p /etc/group /etc/group.old
cp /etc/group /tmp/fichier_test
while read user
do
echo "wireshark:x:128:$user" >>/tmp/fichier_test
done < userstest.txt
Hors ligne
#16 Le 31/05/2016, à 16:00
- Sublimatique
Re : [Résolu] Shell - Copier des lignes dans un fichier
sinon quelque chose comme ça ?
sed -r 's/(.*)/wireshark:x:130:\1/' users.txt >> /tmp/fichier_test
Ce code marche parfaitement ouaw, mais le dernier hic c'est qu'apparement il faut que tout les users soit présentés comme ceci :
wireshark:x:130:user1,user2,user3
Il y a combien de lignes dans ce fichier users.txt ?
Cordialement,
Guy
J'ai 3 lignes, une pour chaque user
Hors ligne
#17 Le 31/05/2016, à 16:02
- Sublimatique
Re : [Résolu] Shell - Copier des lignes dans un fichier
Pourquoi ne pas remplacer
echo "wireshark:x:128:$user" >>/tmp/fichier_test
par
sudo adduser $user wireshark
L'idée d'écrire directement dans /etc/group me semble désastreuse.
Cordialement,
Guy
J'ai remplacé et ça ne passe pas voilà ce que ça donne :
#/bin/sh
cp -p /etc/group /etc/group.old
cp /etc/group /tmp/fichier_test
while read user
do
adduser $user wireshark
# echo "wireshark:x:128:$user" >>/tmp/fichier_test
done
#>userstest.txt
Merci pour votre coopération c'est sympa de m'aider, je suis pas fort en shell mais je donne toute ma gratitude envers cette communauté qu'est ubuntu-fr.org vraiment
Hors ligne
#18 Le 31/05/2016, à 16:10
- gl38
Re : [Résolu] Shell - Copier des lignes dans un fichier
Si tu as 3 utilisateurs, je ne comprends pas l'intérêt de faire tout ça.
Il suffit de taper 3 lignes du genre
sudo adduser user1 wireshark
Il est aussi permis de taper
man adduser
Cordialement,
Guy
Hors ligne
#19 Le 31/05/2016, à 21:36
- Sublimatique
Re : [Résolu] Shell - Copier des lignes dans un fichier
En fait si j'ai 3 lignes c'est parce que c'est en phase de test pour le moment, je dois faire un script en shell pour permettre à 250 pc sous ubuntu de pouvoir faire des captures sur wireshark en non root, une fois dans le groupe wireshark ils peuvent en faire en non root des captures.
Je dois donc mettre tout les users sous forme de liste dans le groupe wireshark du pc afin de les autoriser à capturer des trames avec wireshark
Dernière modification par Sublimatique (Le 01/06/2016, à 08:09)
Hors ligne
#20 Le 01/06/2016, à 08:28
- Compte anonymisé
Re : [Résolu] Shell - Copier des lignes dans un fichier
avec la commande fourni par gl38 dans un script, ça fera quelque chose comme ça :
#!/bin/bash
sudo addgroup --gid 128 wireshark
while read a
do
sudo adduser "$a" wireshark
done < userstest.txt
OU si tu veux absolument utiliser sh :
#!/bin/sh
sudo addgroup --gid 128 wireshark
cat userstest.txt|while read a
do
sudo adduser "$a" wireshark
done
Si tu lances le script en root tu peux enlever les sudo. En tout cas ça sera plus "safe" avec les commandes adéquats.
PS : copies et colles le texte pour éviter les fautes de frappes.
PS2 : il faut aussi que les users existe dans le système avant sinon ça les rajoutes pas.
#21 Le 01/06/2016, à 10:10
- Sublimatique
Re : [Résolu] Shell - Copier des lignes dans un fichier
J'ai fais comme toi mais j'ai ce résultat là à l'éxecution du script :
root@iOptiPlex-7010:~/Documents/Script Addgroup Wireshark# ./script2.sh
addgroup : Le groupe « wireshark » existe déjà.
» n'existe pas.isateur « dstaff
» n'existe pas.isateur « compte
Voici mon code exécute :
#!/bin/sh
addgroup --gid 128 wireshark
cat users.txt|while read a
do
adduser "$a" wireshark
done
Hors ligne
#22 Le 01/06/2016, à 13:57
- Sublimatique
Re : [Résolu] Shell - Copier des lignes dans un fichier
J'ai donc opter pour ce script qui fonctionne :
cp group group.old ; sed '/wireshark/ s/$/,'$(cat users.txt | tr '\n' ',')'/;s/,$//' group.old > group.test
tr -d $'\r' < group.test > group
Maintenant le tout est de faire un deuxième script qui permet d'enlever les users précédemment ajouté à côté de la ligne wireshark:x:130 afin d'interdire quand on en à besoin l'accès aux captures wireshark pour des questions de sécurité
Hors ligne
#23 Le 01/06/2016, à 15:23
- Compte anonymisé
Re : [Résolu] Shell - Copier des lignes dans un fichier
en version "propre" :
deluser nom_de_l'user wireshark
sinon en moins propre pour enlever tous les users :
sed -i 's/wireshark.*/wireshark:x:128:/' group.old
#24 Le 01/06/2016, à 15:33
- Sublimatique
Re : [Résolu] Shell - Copier des lignes dans un fichier
en version "propre" :
deluser nom_de_l'user wireshark
sinon en moins propre pour enlever tous les users :
sed -i 's/wireshark.*/wireshark:x:128:/' group.old
Merci infiniment, cela fonctionne , merci à tous vraiment *coeur sur vous*
Topic Résolu
Hors ligne