se l'istruzione utente query query in etc / passwd?


8

Usando bash sto cercando di interrogare /etc/passwdqualsiasi utente con un ID superiore a 1000. Se esistono, fai qualcosa, altrimenti fai qualcos'altro. Sono perplesso. Qualsiasi aiuto è apprezzato.

if [ "$(id -u)" -gt "1000" </etc/passwd]; then
    do something
else
    do something else
fi

1
Questo deve essere in bash (shell)?
Stephen Rauch,

sì scusa. usando bash
user3239222

Risposte:


8

Prova questo:

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

Il primo grepcerca le passwdrighe con un uid di quattro o più cifre. Il secondo grepfiltra la linea con uid 1000. Lo stato di uscita sarà 0 se rimangono delle linee, 1 se no.


ottengo un errore di sintassi: fine imprevista del file
user3239222

Devi seguirlo con una thenlinea, ecc.
Tom Zych,

1
Ho dimenticato; fare il secondo grep -Evqper sopprimere il suo output.
Tom Zych,

4
Dal suo aspetto, questo cerca campi UID di almeno 4 caratteri, che qui funzionano ma non sono molto utili se il valore di cutoff è qualcosa di diverso da una potenza di dieci. Inoltre, i risultati potrebbero essere fonte di confusione se alcuni dei numeri ottengono zero iniziali per qualche motivo.
Ilkkachu,

1
Se si utilizza YP / NIS o LDAP, analizzare l'output getent passwdanziché il /etc/passwdfile.
Kusalananda

16

Per farlo in un bashciclo, suggerisco di usare reade mi IFSpiace:

#!/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

provato ma produce tutti gli utenti LT e GT
user3239222

1
Produce alcuni utenti come LT e il resto come GT. È quello che pensavo avessi bisogno.
Stephen Rauch,

voglio solo controllare etc / password per vedere se esistono UID superiori a 1000 e fare qualcosa se vero, fare qualcos'altro se falso ..
user3239222

4
Le parole chiave nel vostro commento è se del caso , la questione ha detto per e che . Al plurale mi hanno indicato che intendevi elaborare ciascun utente. Ma altre tre risposte qui non l'hanno letto in questo modo, quindi ....
Stephen Rauch,

14

Invece di leggere /etc/passwddirettamente, dovresti usare getent passwd, che funzionerà anche se alcuni dei tuoi utenti vengono salvati in qualcosa come LDAP o simili. awkdovrebbe essere adatto per il formato di output separato da due punti.

Ciò stamperebbe i nomi utente di tutti gli utenti con UID> 1000:

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

E questo verrebbe stampato solo foundse viene trovata almeno una di queste:

getent passwd | awk -F: '$3 > 1000 {print "found"; exit}'

come lo userei con un'istruzione if però? se $ 3> 1000, fai qualcosa
user3239222

L'ho modificato un po ', perché il primo utente desktop è uguale a 1000, e ci sono altri tipi di utenti come "nessuno", quindi abbiamo anche bisogno di un limite superiore (che ho appena impostato arbitrariamente su 2000):getent passwd | awk -F: '$3 >= 1000 && $3 < 2000 {print $1}'
benjaoming

@benjaoming, err, sì, >= 1000sembrerebbe davvero sensato. La domanda aveva > 1000per qualche motivo però. nobodysembra essere comunemente 6553xo 3276x, quindi è possibile aumentare un po 'quel limite superiore.
ilkkachu,

4

Questo costrutto non ha molto senso:

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

Il idcomando funziona indipendentemente dal reindirizzamento di input. Il reindirizzamento non ha comunque senso qui.

È possibile utilizzare questa pipeline nel confronto di test. Ti mostrerà l'ID utente più alto sulla macchina:

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

Potrebbe essere necessario modificarlo per alcuni sistemi in quanto potrebbe esserci l' nobodyutente con UID 65534presente.


1

Usando il codice di Tom questo ha funzionato per me ..

#!/bin/sh
if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'
then 
    echo "exists"
else
    echo "not exists"
fi

ho creato un utente mrBlonde: x: 1001: 1001 :: / home / mrBlonde: / bin / bash. quando eseguo il codice dice che esiste, quando elimino l'utente, dice che non esiste. L)
user3239222
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.