se a instrução consultar o ID do usuário em etc / passwd?


8

Usando o bash, estou tentando consultar /etc/passwdqualquer usuário com um ID acima de 1000. Se eles existirem, faça alguma coisa, então faça outra coisa. Estou perplexo. Qualquer ajuda é apreciada.

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

1
Isso precisa estar no bash (shell)?
Stephen Rauch

sim, desculpe. usando bash
user3239222

Respostas:


8

Tente o seguinte:

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

A primeira greppesquisa passwdpor linhas com um uid de quatro ou mais dígitos. O segundo grepfiltra a linha com o uid 1000. O status de saída será 0 se alguma linha permanecer, 1 se não.


eu recebo erro de sintaxe: fim de arquivo inesperado
user3239222

Você tem que segui-lo com uma thenlinha, etc.
Tom Zych

1
Eu esqueci; faça o segundo grep -Evqpara suprimir sua saída.
Tom Zych

4
Pelo que parece, isso procura campos UID com pelo menos 4 caracteres, o que funciona aqui, mas não é muito útil se o valor de corte for algo diferente de dez. Além disso, os resultados podem ser confusos se alguns dos números obtiverem zeros à esquerda por algum motivo.
22917 ilkkachu

1
Se você usar YP / NIS ou LDAP, analise a saída em getent passwdvez do /etc/passwdarquivo.
Kusalananda

16

Para fazer isso em um bashloop, sugiro usar reade IFSgostar:

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

tentei isso, mas ele gera todos os usuários LT e GT
user3239222

1
Ele gera alguns usuários como LT e o restante como GT. Foi o que pensei que você precisava.
Stephen Rauch

Eu só quero verificar etc / password para ver se alguma UIDs superior a 1000 existem e fazer alguma coisa se for verdade, fazer outra coisa se falso ..
user3239222

4
As palavras-chave em seu comentário é se alguma , a questão disse para e eles . O plural que eles me indicaram que você pretendia processar cada usuário. Mas três outras respostas aqui não lê-lo dessa maneira, então ....
Stephen Rauch

14

Em vez de ler /etc/passwddiretamente, você deve usar getent passwdisso também funcionará se alguns de seus usuários forem salvos em algo como LDAP ou algo assim. awkdeve ser adequado para o formato de saída separado por dois pontos.

Isso imprimiria os nomes de usuário de todos os usuários com UID> 1000:

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

E isso seria impresso apenas foundse pelo menos um deles fosse encontrado:

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

como eu usaria isso com uma declaração if? se $ 3> 1000, faça alguma coisa #
31322222

Eu modifiquei isso um pouco, porque o primeiro usuário de desktop é igual a 1000, e existem outros tipos de usuários como "ninguém", então também precisamos de um limite superior (que eu acabei de definir arbitrariamente para 2000):getent passwd | awk -F: '$3 >= 1000 && $3 < 2000 {print $1}'
benjaoming

@ Benjaoming, err, sim, de >= 1000fato parece fazer sentido. A pergunta teve > 1000por algum motivo, no entanto. nobodyparece ser comum 6553xou 3276x, então você provavelmente pode aumentar um pouco esse limite superior.
ilkkachu

4

Essa construção não faz muito sentido:

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

O idcomando funciona independentemente do redirecionamento de entrada. O redirecionamento não faz sentido aqui de qualquer maneira.

Você pode usar esse pipeline na sua comparação de teste. Ele mostrará o maior ID de usuário na máquina:

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

Você pode ajustá-lo para alguns sistemas, pois pode haver o nobodyusuário com o UID 65534presente.


1

Usando o código de Tom, isso funcionou para mim ..

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

eu criei um usuário mrBlonde: x: 1001: 1001 :: / home / mrBlonde: / bin / bash. quando executo o código que diz existir, quando excluo o usuário, ele diz que não existe. L)
user3239222
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.