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
user3239222
fonte
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.

Tom Zych
fonte
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
Stephen Rauch
fonte
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}'
ilkkachu
fonte
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.


fonte
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
user3239222
fonte
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