Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/05/2016, à 14:55

Sublimatique

[Résolu] Shell - Copier des lignes dans un fichier

Bonjour tout le monde, big_smile

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. smile

J'ai commencer un script qui n'est pas fini et je pense être sur la bonne voie, des conseils ou idées ? roll

#!/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 big_smile

Dernière modification par Sublimatique (Le 01/06/2016, à 17:02)

Hors ligne

#2 Le 30/05/2016, à 15: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, à 15: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, à 15:27)

Hors ligne

#4 Le 30/05/2016, à 15: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, à 16: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, à 16: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, à 16: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, à 16: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, à 17: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 hmm

Hors ligne

#10 Le 30/05/2016, à 17: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 smile

#/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, à 17: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, à 17: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, à 17:32)

Hors ligne

#13 Le 30/05/2016, à 18: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, à 08: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, à 16:59

Sublimatique

Re : [Résolu] Shell - Copier des lignes dans un fichier

pingouinux a écrit :
  • 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 hmm

#/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, à 17:00

Sublimatique

Re : [Résolu] Shell - Copier des lignes dans un fichier

Anonyme68 a écrit :

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
gl38 a écrit :

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, à 17:02

Sublimatique

Re : [Résolu] Shell - Copier des lignes dans un fichier

gl38 a écrit :

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, à 17: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, à 22: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 smile

Dernière modification par Sublimatique (Le 01/06/2016, à 09:09)

Hors ligne

#20 Le 01/06/2016, à 09: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, à 11: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, à 14: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, à 16: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, à 16:33

Sublimatique

Re : [Résolu] Shell - Copier des lignes dans un fichier

Anonyme68 a écrit :

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 big_smile , merci à tous vraiment *coeur sur vous*

Topic Résolu tongue

Hors ligne