si la consulta de consulta de identificación de usuario en etc / passwd?

8

Usando bash estoy tratando de consultar /etc/passwda cualquier usuario con una identificación superior a 1000. Si existen, haga algo, de lo contrario, haga otra cosa. Estoy perplejo. Cualquier ayuda es apreciada.

if [ "$(id -u)" -gt "1000" </etc/passwd]; then
    do something
else
    do something else
fi
usuario3239222
fuente
1
¿Esto tiene que estar en bash (shell)?
Stephen Rauch
si, lo siento. usando bash
user3239222

Respuestas:

8

Prueba esto:

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

El primero grepbusca passwdlíneas con un uid de cuatro o más dígitos. El segundo grepfiltra la línea con uid 1000. El estado de salida será 0 si quedan líneas, 1 si no.

Tom Zych
fuente
me sale un error de sintaxis: final inesperado del archivo
user3239222
Tienes que seguirlo con una thenlínea, etc.
Tom Zych
1
Olvidé; haga el segundo grep -Evqpara suprimir su salida.
Tom Zych
44
Por lo que parece, esto busca campos UID que tienen al menos 4 caracteres de largo, lo que funciona aquí pero no es muy útil si el valor de corte es algo más que una potencia de diez. Además, los resultados pueden ser confusos si algunos de los números obtienen ceros iniciales por algún motivo.
ilkkachu
1
Si usa YP / NIS o LDAP, analice la salida en getent passwdlugar del /etc/passwdarchivo.
Kusalananda
16

Para hacer eso en un bashbucle, sugiero usar ready me IFSgusta:

#!/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
fuente
intentado eso, pero genera todos los usuarios LT y GT
user3239222
1
Produce algunos usuarios como LT y el resto como GT. Que es lo que pensé que necesitabas.
Stephen Rauch
Yo sólo quiero comprobar etc / contraseña para ver si hay algún UID superior a 1000 existen y hacer algo si es cierto, hacer otra cosa si es falso ..
user3239222
44
Las palabras claves en su comentario es su caso , dijo que la pregunta para y que . El plural me indicaron que pretendías procesar a cada usuario. Pero otras tres respuestas aquí no lo leyeron de esa manera, así que ...
Stephen Rauch
14

En lugar de leer /etc/passwddirectamente, debe usar getent passwd, eso también funcionará si algunos de sus usuarios se guardan en algo como LDAP o similar. awkdebería ser adecuado para el formato de salida separado por dos puntos.

Esto imprimiría los nombres de usuario de todos los usuarios con UID> 1000:

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

Y esto solo se imprimiría foundsi se encuentra al menos uno de estos:

getent passwd | awk -F: '$3 > 1000 {print "found"; exit}'
ilkkachu
fuente
¿Cómo usaría esto con una declaración if? si $ 3> 1000, haga algo
user3239222
Modifiqué esto un poco, porque el primer usuario de escritorio es igual a 1000, y hay otros tipos de usuarios como "nadie", por lo que también necesitamos un límite superior (que acabo de establecer arbitrariamente en 2000):getent passwd | awk -F: '$3 >= 1000 && $3 < 2000 {print $1}'
benjaoming
@benjaoming, err, sí, de >= 1000hecho parece tener sentido. Sin > 1000embargo, la pregunta tenía por alguna razón. nobodyparece ser comúnmente 6553xo 3276x, por lo que probablemente pueda aumentar ese límite superior un poco.
ilkkachu
4

Esta construcción no tiene mucho sentido:

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

El idcomando funciona independientemente de la redirección de entrada. La redirección no tiene sentido aquí de todos modos.

Puede usar esta tubería en su comparación de prueba. Le mostrará la identificación de usuario más alta en la máquina:

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

Es posible que desee ajustarlo para algunos sistemas, ya que puede haber un nobodyusuario con UID 65534presente.


fuente
1

Usando el código de Tom esto funcionó para mí ...

#!/bin/sh
if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'
then 
    echo "exists"
else
    echo "not exists"
fi
usuario3239222
fuente
Creé un usuario mrBlonde: x: 1001: 1001 :: / home / mrBlonde: / bin / bash. cuando ejecuto el código dice que existe, cuando elimino al usuario, dice que no existe. L)
usuario3239222