Commande conviviale pour répertorier tous les utilisateurs sur le système Ubuntu?

22

Existe-t-il une commande conviviale que je peux utiliser pour répertorier les utilisateurs dans une console sur un système Ubuntu?

Lorsque je cat /etc/passwdreçois une liste d'utilisateurs difficile à lire. Ce serait bien de voir une liste alphabétique, avec des entrées organisées en colonnes et avec des noms de groupe entre parenthèses à côté des ID de groupe.

M. Dudley
la source
2
eh bien, / etc / passwd est organisé en colonnes ... si vous ne voulez voir que quelques colonnes, utilisez peut-être cut. Pour alphabétisé, il y en a sort. Si vous avez besoin des noms de groupe, jouez avec join (qui peut en fait ne montrer qu'un sous-ensemble de colonnes, btw).
njsg

Réponses:

27

Bon moyen pour une sortie agréable du fichier / etc / passwd:

$ column -nts: /etc/passwd

Vous pouvez maintenant le trier:

$ column -nts: /etc/passwd | sort

Avec les noms de groupes dans la dernière colonne (pas de parenthèses):

$ paste -d: /etc/passwd <(groups $(cut -d: -f1 /etc/passwd) | sed 's/.*: //') | column -nts: | sort
Nykakin
la source
Merci, ces commandes font ce que je veux. Pour un débutant, c'est très intimidant ... Je suppose que je vais devoir apprendre à créer un alias pour eux.
M. Dudley
Sur Centos, la colonne n'aimait pas l' noption. column -ts: /etc/passwda bien fonctionné.
user1014251
9

Si vous disposez d'un accès root sur la machine, vous pouvez effectuer les opérations suivantes:

sudo grep -vE '^[^*!]+:[*!]:' /etc/shadow | sort | cut -d: -f1 | while read user; do id $user; done | column -ts' ,' | vi '+set nowrap' -

Comment ça marche

Devenez root pour lire le fichier shadow. Vous n'avez besoin des privilèges root que si vous voulez vérifier si l'utilisateur a un mot de passe défini (utilisateur humain), sinon vous pouvez simplement cat /etc/passwdau lieu de sudo grep ...:

sudo 

Afficher uniquement les utilisateurs disposant d'un mot de passe:

grep -vE '^[^*!]+:[*!]:' /etc/shadow

Trier par nom d'utilisateur:

sort 

Jeter toutes les informations à l'exception du nom d'utilisateur:

cut -d: -f1

Itérer à travers les noms d'utilisateur et l'enrichir avec des informations de groupe:

while read user; do id $user; done

Formatez l'entrée en colonnes:

column -ts' ,'

Utilisez vi pour voir le résultat:

vi '+set nowrap' - 

Si vous ne disposez pas d'un accès root,

essayez quelque chose comme ceci:

cut -d: -f1 /etc/passwd | sort | while read user; do id $user; done | sed 's/\(\()\|^\)[^(]*(\|)\)/ /g' | column -t

Sa sortie est un peu différente, mais je laisse le soin au lecteur de combiner les deux parties de cette réponse en quelque chose qui correspond parfaitement au travail. (N'aimez-vous pas simplement sed?)

jippie
la source
"Je laisse cela comme un exercice au lecteur ..." :)
Emanuel Berg
1

Dans Ubuntu, cela peut être comme suit:

sept champs de / etc / passwd stockés dans $ f1, f2 ..., $ f7

while IFS=: read -r f1 f2 f3 f4 f5 f6 f7
do
 echo "User $f1 use $f7 shell and stores files in $f6 directory."
done < /etc/passwd
Fatima Zohra
la source
1

Quelque chose que je fais et qui fonctionne à mes fins est

ls /home

Certes, cela ne vous donne pas vraiment une liste d'utilisateurs, plutôt une liste des répertoires personnels et des répertoires des utilisateurs précédents, mais toute commande que vous souhaitez exécuter sur un utilisateur qui n'existe pas sur le terminal vous le dira et pourrait être un indice à supprimer. le fichier d'accueil qui n'a pas d'utilisateur ou le déplacer!

Sam Hamblin
la source
J'aime ça. Il fait le travail au niveau de base.
aalaap
0

J'ai pensé que ce serait facile avec join, mais joinnécessite que les fichiers soient triés sur le champ de jointure . Il a donc fallu (?) Une solution de contournement avec des fichiers temporaires. La sortie est triée par utilisateur et affiche l'ID utilisateur, groupe et groupe.

uag () {
  TEMP_GROUPS=/var/tmp/sorted_groups
  TEMP_USERS=/var/tmp/sorted_users
  cat /etc/group  | tr ":" " " | sort -k 3 -o $TEMP_GROUPS
  cat /etc/passwd | tr ":" " " | sort -k 4 -o $TEMP_USERS
  join -1 4 -2 3 -o 1.1,2.1,2.3 $TEMP_USERS $TEMP_GROUPS | sort
  rm $TEMP_GROUPS $TEMP_USERS
}

Traduire un personnage en un autre avec tr; sortselon un champ clé avec -k, sortie dans un fichier avec -o; joindre en ce qui concerne les champs dans le premier ( -1) et le deuxième ( -2) fichier, sortir certains champs dans le premier fichier ( -o 1.1) ainsi que le second ( ,2.1,2.3).

Emanuel Berg
la source
notez que ce /tmpserait mieux, car FHS déclare que /var/tmpcela ne sera pas effacé lors des redémarrages, dont nous n'avons pas vraiment besoin.
strugee