si l'instruction demande l'ID utilisateur dans etc / passwd?

8

En utilisant bash, j'essaie d'interroger /etc/passwdtous les utilisateurs ayant un identifiant supérieur à 1000. S'ils existent, faites autre chose. Je suis perplexe. Toute aide est appréciée.

if [ "$(id -u)" -gt "1000" </etc/passwd]; then
    do something
else
    do something else
fi
user3239222
la source
1
Doit-il être en bash (shell)?
Stephen Rauch
Oui désolé. en utilisant bash
user3239222

Réponses:

8

Essaye ça:

if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'

Le premier greprecherche passwddes lignes avec un uid de quatre chiffres ou plus. Le second grepfiltre la ligne avec l'ID 1000. Le statut de sortie sera 0 s'il reste des lignes, 1 sinon.

Tom Zych
la source
j'obtiens une erreur de syntaxe: fin de fichier inattendue
user3239222
Vous devez le suivre avec une thenligne, etc.
Tom Zych
1
J'ai oublié; faire le deuxième grep -Evqpour supprimer sa sortie.
Tom Zych
4
À première vue, cela recherche des champs UID d'au moins 4 caractères, ce qui fonctionne ici mais n'est pas très utile si la valeur de coupure est autre qu'une puissance de dix. De plus, les résultats peuvent prêter à confusion si certains des nombres deviennent des zéros non significatifs pour une raison quelconque.
ilkkachu
1
Si vous utilisez YP / NIS ou LDAP, analysez la sortie de getent passwdau lieu du /etc/passwdfichier.
Kusalananda
16

Pour faire cela en bashboucle, je suggère d'utiliser readet d' IFSaimer:

#!/usr/bin/env bash
while IFS=':' read -r user passwd uid gid comment home shell;  do
    if [ "$uid" -gt 1000 ] ; then
        echo GT $user
    else
        echo LT $user
    fi
done < /etc/passwd
Stephen Rauch
la source
a essayé mais il génère tous les utilisateurs LT et GT
user3239222
1
Il génère certains utilisateurs en LT et les autres en GT. C'est ce dont je pensais que vous aviez besoin.
Stephen Rauch
je veux seulement vérifier etc / mot de passe pour voir si des UID supérieurs à 1000 existent et faire quelque chose si vrai, faire autre chose si faux ..
user3239222
4
Les mots clés de votre commentaire est le cas échéant , la question a dit pour et ils . Au pluriel, ils m'ont indiqué que vous aviez l'intention de traiter chaque utilisateur. Mais trois autres réponses ici ne l'ont pas lu de cette façon, alors ....
Stephen Rauch
14

Au lieu de lire /etc/passwddirectement, vous devriez utiliser getent passwd, cela fonctionnera également si certains de vos utilisateurs sont enregistrés dans quelque chose comme LDAP ou autre. awkdevrait être bien adapté au format de sortie séparé par deux-points.

Cela afficherait les noms d'utilisateur de tous les utilisateurs avec UID> 1000:

getent passwd | awk -F: '$3 > 1000 {print $1}'

Et cela ne ferait qu'imprimer foundsi au moins un tel est trouvé:

getent passwd | awk -F: '$3 > 1000 {print "found"; exit}'
ilkkachu
la source
comment pourrais-je l'utiliser avec une instruction if? si 3 $> 1000, faites quelque chose
user3239222
J'ai modifié cela un peu, car le premier utilisateur de bureau est égal à 1000, et il existe d'autres types d'utilisateurs comme "personne", nous avons donc également besoin d'une limite supérieure (que je viens de fixer arbitrairement à 2000):getent passwd | awk -F: '$3 >= 1000 && $3 < 2000 {print $1}'
benjaoming
@benjaoming, euh, oui, >= 1000il semblerait en effet logique. La question avait cependant > 1000une raison. nobodysemble être communément 6553xou 3276x, donc vous pouvez probablement augmenter un peu cette limite supérieure.
ilkkachu
4

Cette construction n'a pas beaucoup de sens:

"$(id -u)" -gt "1000" </etc/passwd

La idcommande fonctionne quelle que soit la redirection d'entrée. La redirection n'a aucun sens ici de toute façon.

Vous pouvez utiliser ce pipeline dans votre comparaison de test. Il vous montrera l'ID utilisateur le plus élevé sur la machine:

cat /etc/passwd | awk -F: '{print $3}' | sort -n | tail -n1

Vous voudrez peut-être le modifier pour certains systèmes car il peut y avoir l' nobodyutilisateur avec UID 65534présent.


la source
1

En utilisant le code de Tom, cela a fonctionné pour moi ..

#!/bin/sh
if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'
then 
    echo "exists"
else
    echo "not exists"
fi
user3239222
la source
j'ai créé un utilisateur mrBlonde: x: 1001: 1001 :: / home / mrBlonde: / bin / bash. lorsque j'exécute le code, il dit qu'il existe, lorsque je supprime l'utilisateur, il dit qu'il n'existe pas. L)
user3239222