#1 Le 30/07/2018, à 18:44
- linuxm@c
Bash – affiche la liste de tous les utilisateurs et le groupe
# !/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, à 19: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, à 19: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, à 19:19)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 30/07/2018, à 19:35
- linuxm@c
Re : Bash – affiche la liste de tous les utilisateurs et le groupe
il faudrait remplacer par
'':''
c-à-d
' ' : ' '
Merci a f.x0
après le remplacement, le problème reste le même
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, à 20:47)
Hors ligne
#5 Le 30/07/2018, à 21: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
Une fois satisfait, associes ton script à un alias dans ton .bashrc ou .bash_aliases.
Hors ligne
#6 Le 30/07/2018, à 22: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, à 22:31
- linuxm@c
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é :
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 30/07/2018, à 23:12)
Hors ligne
#8 Le 30/07/2018, à 22: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, à 22:57
- linuxm@c
Re : Bash – affiche la liste de tous les utilisateurs et le groupe
eh ben, tiens !
- rajoutait une commande externe
- ralentir l'exécution du script !
?????????
?????????
Dernière modification par linuxm@c (Le 30/07/2018, à 23:13)
Hors ligne
#10 Le 30/07/2018, à 23: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 30/07/2018, à 23:24
- linuxm@c
Re : Bash – affiche la liste de tous les utilisateurs et le groupe
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 30/07/2018, à 23:49)
Hors ligne
#12 Le 31/07/2018, à 06: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, à 12:26
- linuxm@c
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
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, à 13:03)
Hors ligne
#14 Le 31/07/2018, à 13: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
Dernière modification par Watael (Le 31/07/2018, à 18:33)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#15 Le 31/07/2018, à 14: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, à 14:06)
#16 Le 31/07/2018, à 14: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, à 14:23)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#17 Le 31/07/2018, à 14: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 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.
#18 Le 31/07/2018, à 16: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, à 17:32)
Hors ligne
#19 Le 31/07/2018, à 17: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.
#20 Le 31/07/2018, à 18:20
- linuxm@c
Re : Bash – affiche la liste de tous les utilisateurs et le groupe
- 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, à 22:46)
Hors ligne
#21 Le 31/07/2018, à 19:05
- Oosfalte
Re : Bash – affiche la liste de tous les utilisateurs et le groupe
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
Hors ligne
#22 Le 02/08/2018, à 18:28
- linuxm@c
Re : Bash – affiche la liste de tous les utilisateurs et le groupe
Vas-y, plonge ...... le bash ......... amuses toi
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, à 18:33)
Hors ligne
#23 Le 02/08/2018, à 19: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, à 09:16
- linuxm@c
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!
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, à 09:21)
Hors ligne
#25 Le 04/08/2018, à 09: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, à 09:52)