7
votes

Shell Script pour obtenir la liste des utilisateurs définis sur Linux?

Je l'ai mis ensemble, mais ça craint: (par exemple, des nombres magiques là-bas, une analyse de texte .. BOO!)

awk -F: '{if($3 >= 1000 && $3 < 2**16-2) print $1}' /etc/passwd


1 commentaires

Qu'est-ce qui ne va pas avec le texte analysé?


6 Réponses :


1
votes

Vous essayez simplement d'obtenir une liste de tous les utilisateurs de / etc / passwd? Si tel est le cas, je pense que ce serait une solution plus facile: xxx pré>

EDIT: strong> p>

Si vous voulez seulement une liste de la liste des utilisateurs Utilisateurs (pas les utilisateurs du système), vous pouvez utiliser l'un d'entre eux: P>

grep /home /etc/passwd | cut -d: -f1


3 commentaires

Cool idées dans votre édition. J'ai appris quelque chose. On dirait toujours comme un hack cependant, n'est-ce pas?


@Robottinosino: Nope, c'est juste des scripts de shell réguliers :)


De nombreux sites ont des annuaires à domicile utilisateur dispersés entre les systèmes de fichiers et souvent même sur le réseau sur différents hôtes - et tous ne créent pas tous les répertoires de méta à domicile. / net / serveur1 / fs / d3 / users / tom par exemple.



2
votes

Je ne suis pas sûr de savoir pourquoi vous ne faites que> 1000, BeCuase sur le système RedHat, il commence à 500.

Pour moi, ce script AWK fonctionne OK: P>

awk -F: '{if(!(( $2 == "!!")||($2 == "*"))) print $1}' /etc/shadow 


4 commentaires

Vous avez totalement raison, la base a été chourée de manière incorrecte. 1000 est un "nombre magique" stupide, ma faute .. Mais alors .. donc 500 ?! Ou, n'est-ce pas?


Ce n'est pas nécessaire, votre document lié stipule les opérateurs dans l'ordre de croissant Precedence, donc && a une priorité inférieure à celle > = et << / code>.


Pour Redhat, c'est 500. On dirait qu'aucun service n'est utilisé après 499. Mais ce n'est qu'à Rhel. Vous pouvez ajouter quelque chose comme "grep / home" ou "grep / bin / bash" dépend de vos paramètres système. Vous pouvez également obtenir uniquement les utilisateurs avec mot de passe - voir ci-dessus.


Je crois que les systèmes de Debian commencent à 1000.



2
votes

extraire les ID utilisateur minimum et maximum de /etc/login.defs code> puis sélectionnez les utilisateurs avec des identifiants entre ces marges à partir de / etc / passwd code>:

UID_MIN=$(awk '/^UID_MIN/ {print $2}' /etc/login.defs)
UID_MAX=$(awk '/^UID_MAX/ {print $2}' /etc/login.defs)

awk -F: -v min=$UID_MIN -v max=$UID_MAX '$3 >= min && $3 <= max{print $1}' /etc/passwd


4 commentaires

Sur une note latérale, le si est superflu ... juste faire '$ 3> = min && $ 3 <= max {imprimer $ 1}' .


Cela manquera beaucoup, dans certains cas, presque tous les utilisateurs des sites utilisant LDAP, NIS et d'autres mécanismes d'utilisateurs comprenant des bases de données stockées en dehors du fichier / etc / passwd.


@ AlexNorth-Keys true. Cependant, j'avais l'impression qu'il recherchait des utilisateurs locaux.


Certaines personnes fous utilisent également LDAP pour les utilisateurs locaux ;-) Il n'a pas spécifié si seul le fichier / etc / passwd devait être utilisé comme source.



12
votes

Certains systèmes UNIX n'utilisent pas / etc / passwd ou ont des utilisateurs qui ne sont pas spécifiés là-bas. Vous devez utiliser getent passwd au lieu de lire / etc / passwd .

Mon système contient également des utilisateurs désactivés et peuvent se connecter plus plus longtemps avec leur commande de connexion à < Code> / bin / faux ou / usr / sbin / nologin . Vous voulez probablement les exclure aussi.

Voici ce qui fonctionne pour moi, y compris Arheops AWK Command et ANSGAR selon le code pour obtenir le min et max à partir de login.defs : xxx


3 commentaires

Fonctionne bien sur mon réseau à domicile, malgré les utilisateurs de LDAP, des annuaires à domicile automobile avec des chemins étranges, etc. Il produit des doublons pour les utilisateurs qui ont à la fois des entrées LDAP et Fallback / etc / Passwd, mais autrement, agréable.


Les doublons peuvent être éliminés en ajoutant un | Trier -u .


... ou en utilisant un tableau temporaire dans le cadre de la commande awk .



2
votes

Voici une autre approche qui ne donne qu'un programme externe, getent (suggéré par @ansgarwiechers) afin que les bases de données passwd locales et réseau soient utilisées. Celui-ci réduit le nombre de fourches à un seul pour getent lui-même. Sa portabilité est quelque peu limitée en exigeant Bash4, cependant. XXX


1 commentaires

+1. Vous devriez mentionner cependant que cela nécessite Bash4 , donc n'est pas une solution très portable.



1
votes

Voici une simplification de la réponse de @ Stephenostermiller qui l'obtient avec seulement deux processus. Je pense qu'il est plus facile de lire également (à condition que vous connaissez bien l'AWK nr == fnr idiom). XXX

Les différents modèles de fractionnés dans les deux entrées est un peu de verrue; Peut-être que vous pourriez résoudre ce problème plus élégamment d'une manière ou d'une autre.


0 commentaires