se o id do usuário da consulta de instrução em etc / passwd?

7

Usando o bash, estou tentando consultar /etc/passwd para qualquer usuário com um ID acima de 1000. Se eles existirem, faça algo, senã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
    
por user3239222 26.03.2017 / 17:10

5 respostas

8

Tente isto:

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

O primeiro grep pesquisa passwd para linhas com um fluxo de quatro ou mais dígitos. O segundo grep filtra a linha com o uid 1000. A saída o status será 0 se alguma linha permanecer, 1 se não.

    
por 26.03.2017 / 17:24
16

Para fazer isso em um loop bash , sugiro usar read e IFS como:

#!/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
    
por 26.03.2017 / 17:33
14

Em vez de ler /etc/passwd diretamente, você deve usar getent passwd , que também funcionará se alguns de seus usuários forem salvos em algo como LDAP ou algo semelhante. awk deve 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 só imprimirá found se pelo menos um desses for encontrado:

getent passwd | awk -F: '$3 > 1000 {print "found"; exit}'
    
por 26.03.2017 / 18:31
4

Esse constructo não faz muito sentido:

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

O comando id funciona independentemente do redirecionamento de entrada. O redirecionamento não faz sentido aqui de qualquer forma.

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

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

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

    
por 26.03.2017 / 17:28
1

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

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