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/07/2018, à 19:44

linuxm@c

Bash – affiche la liste de tous les utilisateurs et le groupe

Source

# !/bin/bash
for i in `more /etc/passwd | cut -d ‘ :’ -f 1-3` ;
do
user=`echo $i | cut -d ‘ :’ -f -1` ;
idgroup=`echo $i | cut -d ‘ :’ -f 3-` ;
group=`grep :$idgroup : /etc/group | cut -d ‘ :’ -f -1` ;
echo " $user,$group "
done

le script me renvoi

cut: le délimiteur doit être un seul caractère
Saisissez « cut --help » pour plus d'informations.

Question: ou est l'erreur ?

Hors ligne

#2 Le 30/07/2018, à 20:02

f.x0

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

Bonjour linuxm@c,

je pense que le problème vient de  ‘ :’
il faudrait remplacer par

'':''

c-à-d

'  '  :  '  '

SOPI

Hors ligne

#3 Le 30/07/2018, à 20:18

Watael

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

le problème vient de ce qu'on ne lit pas un fichier de cette manière :

while IFS=':' read -r nom chif uid gid reste
do
   : whatever with $nom and $gid
done </etc/passwd

pour aller plus loin, il faut nous dire avec des mots et un exemple ce que tu veux.

Dernière modification par Watael (Le 30/07/2018, à 20:19)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 30/07/2018, à 20:35

linuxm@c

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

f.x0 a écrit :

il faudrait remplacer par

'':''

c-à-d

'  '  :  '  '

Merci a f.x0
après le remplacement, le problème reste le même



Watael a écrit :

il faut nous dire avec des mots et un exemple ce que tu veux.

voila ce que je veux -->  un résultat comme celui ci

UID                                 GID                         Admin                        Groupes secondaires
------                                -----                         ---------                        -----------------------------
1001,Martin                   1001,Admin              Yes                            netdev, mlocate, ssl-cert , uuidd,sudo,adm,virtualbox
1002,Bernard                 1001,Admin             Yes                            usb, dev, ssl-cert , uuidd,sudo,adm,virtualbox   
1003,Dubois                   1003,Dubois             -                                lp,virtualbox
1004,Rousseau             1004,Rousseau         -                                gdm,saned




Autrement dit
au lieux de tapez ,  pour chaque utilisateur

id user_name

je cherche a lister tous les utilsateurs avec  leurs UIDs , GIDs , Groupes secondaires . en une seul commande ( ou avec script)

Dernière modification par linuxm@c (Le 30/07/2018, à 21:47)

Hors ligne

#5 Le 30/07/2018, à 22:08

Oosfalte

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

Bonsoir,
A l'arrache, code pas bô car fin de journée, fatigué :

# !/bin/bash                                                                    
for i in $(cat /etc/passwd | cut -d ":" -f 1) ;                                  
do                                                                              
    echo -en $i"\t "                                                              
    id $i | sed -e "s/ groupes/\n\tgroupes/"  
done
exit 0

A peaufiner donc à coups de echo, sed, tr, printf selon ton imagination wink
Une fois satisfait, associes ton script à un alias dans ton .bashrc ou .bash_aliases.

Hors ligne

#6 Le 30/07/2018, à 23:13

Watael

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

for i in $(cat ou more

ON NE LIT PAS UN FICHIER DE CETTE MANIÈRE !

et pourquoi ne pas faire un id pour chaque "$nom" d'utilisateur ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 30/07/2018, à 23:31

linuxm@c

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

Oosfalte a écrit :

Bonsoir,
A l'arrache, code pas bô car fin de journée, fatigué :

Merci a Oosfalte pour le script
j'ai ajouté un grep au 2em ligne,  et ça a fonctionné
voila un exemple du  résultat

root	 uid=0(root) gid=0(root)
	  groupes=0(root)
user01	 uid=1000(user01) gid=1000(user01)
	  groupes=1000(user01),4(adm),27(sudo)
user03	 uid=1003(user03) gid=100(users)
	groupes=100(users)

user04	 uid=1004(user04) gid=1004(user04)
	groupes=1004(user04),21(fax),113(bluetooth)

le mieux est de le voir comme ça

root          uid=0(root) gid=0(root)
              groupes=0(root)

user01     uid=1000(user01) gid=1000(user01)
              groupes=4(adm),27(sudo)

user03       uid=1003(user03) gid=100(users)
             groupes=

user04       uid=1004(user04) gid=1004(user04)
             groupes=21(fax),113(bluetooth)

c.a.d -->  linge01 = uid & gid      et 2em ligne groups secondaires seulement

Dernière modification par linuxm@c (Le 31/07/2018, à 00:12)

Hors ligne

#8 Le 30/07/2018, à 23:48

Watael

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

j'ai ajouté un grep, et ça a fonctionné

eh ben, tiens !
et si on rajoutait une commande externe pour encore ralentir l'exécution du script !


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 30/07/2018, à 23:57

linuxm@c

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

Watael a écrit :

eh ben, tiens !
- rajoutait une commande externe
- ralentir l'exécution du script !

?????????
?????????

Dernière modification par linuxm@c (Le 31/07/2018, à 00:13)

Hors ligne

#10 Le 31/07/2018, à 00:13

Watael

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

cat, more, grep, sed... sont des commandes qui ne font pas partie intégrante du shell : ce sont des commandes externes, contrairement à echo, printf, shopt, popd...
et chaque fois qu'on en appelle une cela requiert des ressources système supplémentaires, ce qui ralentit l'exécution du script !

le shell est lent, et les appels répétés à des commandes externes le rendent encore plus lent, il vaut donc mieux, quand le shell le permet, les éviter (surtout dans le cadre de la manipulation de variables).
par contre, des commandes externes bien "ajustées" peuvent être plus rapides que le shell...


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 31/07/2018, à 00:24

linuxm@c

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

Watael a écrit :

Les commandes externes ne font pas partie intégrante du shell comme : cat, more, grep, sed  (  contrairement à echo, printf, shopt, popd...)
qu'on en appelle une cela requiert des ressources système supplémentaires, ce qui ralentit l'exécution du script !

Merci pour l’explication.
NB: je suis novice en shell

Peut-être vous pourrez bien améliorer ce script

Dernière modification par linuxm@c (Le 31/07/2018, à 00:49)

Hors ligne

#12 Le 31/07/2018, à 07:36

pingouinux

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

Bonjour,
Essaye ceci

#!/bin/bash
while IFS=: read user bidon
do
   printf "%s\t%s %s\n\t%s\n\n" "$user" $(id $user)
done </etc/passwd

Hors ligne

#13 Le 31/07/2018, à 13:26

linuxm@c

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

pingouinux a écrit :

Bonjour,
Essaye ceci

#!/bin/bash
while IFS=: read user bidon
do
   printf "%s\t%s %s\n\t%s\n\n" "$user" $(id $user)
done </etc/passwd

Résultat du test , le script fonctionne très bien
- il affiche ( human user)  et (system user)
- moi je veux afficher uniquement les  ( human user)

voici comment filtrer  la liste du Human user
Mais je ne s'est pas comment l'ajouter au script

awk -F: '$6 ~ /\/home/ && $3 >= 500 {print $1}' /etc/passwd

ou

sort /etc/passwd -t":" -k1 -n | grep   bash

ou

cat /etc/passwd | cut -d: -f 1,3,6 | grep "[1][0-9][0-9][0-9]"

Dernière modification par linuxm@c (Le 31/07/2018, à 14:03)

Hors ligne

#14 Le 31/07/2018, à 14:24

Watael

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

tous les utilisateurs "humains" ne sont pas obligatoirement logés sous /home.

pourquoi cat ? UUOC!

sur les distributions basées sur Debian, les utilisateurs/admin ont un UID égal à zéro ou supérieur ou égal à 500
=>

while IFS=':' read -r nom chif uid reste
do
   test $uid -eq 0 -o $uid -ge 500 && { printf '%s\t' "$nom"; id "$nom";}
done </etc/passwd

je te laisse régler son compte à nobody wink

Dernière modification par Watael (Le 31/07/2018, à 19:33)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#15 Le 31/07/2018, à 15:06

bruno

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

Tous les utilisateurs triés par UID

column -nts: /etc/passwd | sort -nk3

Les utilisateurs standard en récupérant les valeurs UID_MIN et UID_MAX dans /etc/login.defs :

column -nts: /etc/passwd | awk '{ if($3>999 && $3<60000) { print $0 } }'

Dernière modification par bruno (Le 31/07/2018, à 15:06)

Hors ligne

#16 Le 31/07/2018, à 15:22

Watael

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

j'aime beaucoup la sortie de passwd par column, mais cette commande est inutile avant awk : awk peut définir un séparateur :

awk -F ':' '$3>=500 && $3<60000' /etc/passwd

print $0 est le comportement par défaut.

Dernière modification par Watael (Le 31/07/2018, à 15:23)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#17 Le 31/07/2018, à 15:47

bruno

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

Je ne suis pas du tout un spécialiste de awk wink Par contre ta commande ne met pas en forme en colonnes ou alors il faut faire :

awk -F ':' '$3>=500 && $3<60000' /etc/passwd | colmun -nts:

column c'est le truc à utiliser pour afficher de manière lisible des fichiers texte à séparateur.

Hors ligne

#18 Le 31/07/2018, à 17:26

linuxm@c

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

ce script marche très bien

# !/bin/bash                                                                    
for i in $(getent passwd | grep -wFf /etc/shells | cut -d ":" -f 1) ; do
sudo passwd -S  $i | awk  '{print $2}'
   id $i ; done
exit 0

Il affiche

L
root	 uid=0(root) gid=0(root)	        groupes=0(root)
P
user01	  uid=1001(user01) gid=1001(user01)	groupes=1001(user01),4(adm),27(sudo),118(saned),125(gdm)
P
user02	  uid=1002(user02) gid=1002(user02)	groupes=1002(user02),118(saned),125(gdm)
NL
user03      uid=1003(user03) gid=1003(user03)	groupes=1003(user03),21(fax),113(bluetooth),118(saned),125(gdm)

Comment le modifier pour l'avoir comme ça

------------------------------------------------------------------------------------------------------------------------------------------
etat        USER                           GID                          Groupes secondaires                                                 
-------------------------------------------------------------------------------------------------------------------------------------------
L                  0(root)                    0(root)                      4(adm),27(sudo),118(saned),125(gdm)
P            1001(user01)         1001(user01)                4(adm),27(sudo),118(saned),125(gdm)
P            1002(user02)         1002(user02)                118(saned),125(gdm)
NP         1003(user03)         1003(user03)                21(fax),113(bluetooth),118(saned),125(gdm)
------------------------------------------------------------------------------------------------------------------------------------------

Pour la commande

sudo passwd -S user_name

voir  man passwd

-S, --status
           Afficher l'état d'un compte. Cet état est constitué de 7 champs. Le premier champ est le nom du compte. Le second champ indique si le mot de
           passe est bloqué (L), n'a pas de mot de passe (NP) ou a un mot de passe utilisable (P). Le troisième champ donne la date de dernière
           modification du mot de passe. Les quatre champs suivants sont : la durée minimum avant modification, la durée maximum de validité, la durée
           d'avertissement, et la durée d'inactivité autorisée pour le mot de passe. Les durées sont exprimées en jours.



merci a tous ceux qui ont participé positivement

Dernière modification par linuxm@c (Le 31/07/2018, à 18:32)

Hors ligne

#19 Le 31/07/2018, à 18:38

bruno

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

Tu peux avoir des utilisateurs standard sans shell (/bin/false ou /sbin/nologin) et des utilisateurs système avec shell. La seule méthode fiable pour séparer les utilisateurs standards des utilisateurs système et basée sur les UID.
Watael a donné la solution en #14. Il ne te reste qu' adapter et rajouter quelques lignes de printf pour obtenit ton tableau.

Hors ligne

#20 Le 31/07/2018, à 19:20

linuxm@c

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

bruno a écrit :

- Watael a donné la solution en #14.
-  rajouter quelques lignes de printf pour obtenit ton tableau.


je  suis novice au shell , je ne sais pas comment adapter  la suggestion de Mr  Watael
Car ça n'a pas marché




Mais
Maintenant  (Dernière modification par Watael (Aujourd'hui à 18:33)
que  Mr  Watael  a modifier la solution  #14. en ajoutent     </etc/passwd . ça a fonctionné

j'ai ajoutée  grep -v nobody   au script

while IFS=':' read -r nom chif uid reste
do
   test $uid -eq 0 -o $uid -ge 500 && { printf '%s\t' "$nom"; id "$nom";} | grep -v nobody
done </etc/passwd

Voila le résultat
******************
root     uid=0(root) gid=0(root)            groupes=0(root)
user01      uid=1001(user01) gid=1001(user01)    groupes=1001(user01),4(adm),27(sudo),118(saned),125(gdm)
user02      uid=1002(user02) gid=1002(user02)    groupes=1002(user02),118(saned),125(gdm)
user03      uid=1003(user03) gid=1003(user03)    groupes=1003(user03),21(fax),113(bluetooth),118(saned),125(gdm) .

Dernière modification par linuxm@c (Le 31/07/2018, à 23:46)

Hors ligne

#21 Le 31/07/2018, à 20:05

Oosfalte

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

linuxm@c a écrit :

je  suis novice au shell , je ne sais pas comment adapter  la suggestion de Mr  Watael

Vas-y, plonge: https://abs.traduc.org/abs-fr/index.html , le bash ça reste accessible, amuses toi smile

Hors ligne

#22 Le 02/08/2018, à 19:28

linuxm@c

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

Oosfalte a écrit :

Vas-y, plonge ...... le bash ......... amuses toi smile

le script Apres modification

# !/bin/bash   
for i in $(getent passwd | grep -wFf /etc/shells | cut -d ":" -f 1) ; do
sudo passwd -S  $i | awk  '{print "│ " $2}'  >> aaa
   id $i | awk '{printf ("│  %-20s│  %-40s│\n",   $1=substr($1,5,20),$3=substr($3,9,40))}'  >> aaa ; done
cat aaa | sed "N;s/\n/ /"; rm aaa
exit 0

Dernière modification par linuxm@c (Le 02/08/2018, à 19:33)

Hors ligne

#23 Le 02/08/2018, à 20:17

Watael

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

grep + cut = awk
awk pour n'afficher qu'un seul champs = cut

et UUOC!


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#24 Le 04/08/2018, à 10:16

linuxm@c

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

Watael a écrit :

grep + cut = awk
awk pour n'afficher qu'un seul champs = cut
et UUOC!

Merci a vous Mr Watael
je n'arrive pas à maitriser la commande awk avec printf

voila mon problème
les commandes suivantes
                                                                                                                                                                                              comment rectifier $col1       ↓↓

name=victor;col1=`sudo passwd -S $name|awk '{print "│ " $2}'`; id $name | awk '{printf ("│  %-10s│  %-20s│  %-40s│\n", $col1,$1=substr($1,5,20),$3=substr($3,9,40))}'

affiche                     │  uid=1000(victor) gid=1000(victor) groupes=1000(victor),4(adm),27(sudo)│  1000(victor)       │  1000(victor),4(adm),27(sudo)           │
alors que je cherche à afficher                                                                                                │  P│  1000(victor)       │  1000(victor),4(adm),27(sudo)           │


Remarque

echo name=   $name;echo   col1=   $col1

donne
name= ibrahim
col1  = │ P

Dernière modification par linuxm@c (Le 04/08/2018, à 10:21)

Hors ligne

#25 Le 04/08/2018, à 10:43

bruno

Re : Bash – affiche la liste de tous les utilisateurs et le groupe

#!/bin/bash

term_cols=$(tput cols)

format='| %-15s| %-15s| %-15s|%s\n'

printf "$format" "User(id)" "Group(id)" "Status" "Groups";
printf %"$term_cols"s |tr " " "-"

while IFS=':' read -r user pass uid gid other_details;
do
    if [ $uid -eq 0 ] || [ $uid -ge 500 ] && [ $uid -le 60000 ]
    then
    status="$(passwd -S "$user"| cut -d " " -f 2)"
    primary_group="$(getent group "$gid" | cut -d ":" -f 1)"
    all_groups="$(groups "$user" | cut -d ":" -f 2)"
    printf "$format" "$user""(""$uid"")" "$primary_group""(""$gid"")" "$status" "$all_groups";
    printf %"$term_cols"s |tr " " "-"
    fi
done < /etc/passwd

Dernière modification par bruno (Le 04/08/2018, à 10:52)

Hors ligne