Grep /etc/passwd et /etc/group pour la liste de tous les utilisateurs et chaque groupe auquel appartient l'utilisateur
Je suis en train de grep
/etc/passwd
et /etc/group
à la liste de TOUS les utilisateurs et chaque groupe auquel appartient l'utilisateur.
IE:
Jon Doe, root:randomgroup:randomgroup2:randomgroup3
Billy Bob, admin:apache:backups
Timmy Tim, root:www
De toute façon, c'est ce que j'ai jusqu'à présent mais je ne suis pas entièrement sûr de la façon de l'obtenir pour grep groupes et match sur le champ utilisateur.
cat /etc/passwd | cut -d: -f1,5
Cette affiche uniquement l'utilisateur avec un ":" et le Nom Complet
Comment pourrais-je aller sur le faire?
Vous devez vous connecter pour publier un commentaire.
Même en ignorant la possibilité d'un réseau de bases de données pour vos fichiers, vous ne pouvez pas vraiment utiliser
grep
pour ce travail, au moins, pas si vous allez le faire vraiment à fond. Vous devriez probablement utiliser Perl ou Python ou un autre langage de script de votre choix.Notez qu'il existe un groupe spécifié par le numéro de l'utilisateur dans le
/etc/passwd
fichier. Il peut y avoir un nombre arbitraire d'autres groupes énumérés dans/etc/group
pour le même utilisateur. Supposons que les utilisateurs primaires GID' est 23 dans/etc/passwd
. Il n'y a aucune garantie que l'entrée pour le groupe des 23 en/etc/group
donnera la liste de l'utilisateur.Notez que vous pouvez avoir toutes sortes de weirdnesses dans le fichier de groupe.
/etc/passwd
qui ne sont pas répertoriés dans/etc/group
./etc/passwd
fichier (souvent pour permettre à différentes personnes de se connecter avec leurs propres informations d'identification — nom et mot de passe, mais à tous les exécuter en tant qu'UID 0, akaroot
).Affaire avec tous ces est un cauchemar — et oui, la quasi-totalité de ces se produire sur les systèmes sur lesquels je travaille, mais ne pas administrer.
Quelque part, j'ai le code pour aider à cette analyse; c'est du Perl, et utilise
getpwent()
etgetgrent()
pour récupérer les informations (à partir de fichiers ou d'un réseau configuré par les admins). Il n'est pas assez.Pour un exercice à faire en classe d'analyse, vous avez probablement besoin d':
De
/etc/passwd
:De
/etc/group
:C'est beaucoup plus simple, il suffit de canard et d'utiliser le
id
commande pour le faire la plupart du travail pour vous. Chalut par/etc/passwd
avecgrep
pour obtenir les noms d'utilisateur, puis utilisezid
pour spécifier les groupes auxquels l'utilisateur appartient. Voir la réponse par gvalkov pour une réponse qui est susceptible d'être suffisant pour sane systèmes.Cela vous donne des noms et des numéros; jouer avec les options de
id
fonction de vos besoins. C'est à l'aide de GNUgrep
; la-o
option est pratique mais pas portable. Heureusement, les noms d'utilisateur Unix ne pas contenir des sauts de ligne (ou des deux-points), ce qui simplifie l'utilisation dexargs
.Groupe D'Utilisateurs De La Carte
243 lignes ou Perl, certains de il commentaire. Regarder la ligne shebang; le code est de trois ans et que j'ai pris à l'aide de
#!/usr/bin/env perl
depuis que ceci a été écrit; j'ai ensuiteuse warnings;
à la partie supérieure du corps de code.Certains de la sortie de synthèse:
Les chaînes de x sont distincts des noms que j'ai masqué.
Si l'exigence d'utiliser grep sur
/etc/passwd
et/etc/group
n'est pas trop difficile, envisager la solution suivante:S'il vous plaît, tenez compte de @JonathanLeffler est avis que ce problème n'est pas aussi simple qu'il y paraît.
J'ai juste besoin moi-même aujourd'hui et est venu avec les suivants en environ 2 minutes de jongler avec des pages man:
Peut également être réduit légèrement avec:
Ressemble la sortie de plusieurs id commandes en ligne:
Le résultat n'est pas le plus lisible, mais il est assez simple et facile à retenir. @gvalkov réponse est beaucoup plus clair dans cet aspect.
Je suis passé par le même problème à l'aide d'une commande awk, j'ai vu quelques réponses ci-dessus qui ressemble presque la même
awk -F ":" '{print $value_of_field_to_print}' /path_of_file_containing_fields
Par exemple, si je veux de plusieurs champs, je vais juste ajouter une autre impression
$value_of_field_to_print
et entre eux ajouter un séparateurCe serait semblable à
awk est le nom de la commande qui gère les fichiers, les
-F fs
option définit le champ d'entrée du séparateur ":" ou "séparateur"à l'expression régulière
fs
.cela pourrait éviter à l'aide de la
cat
fonction et, éventuellement, de gagner du temps .