Usando o grep em / etc / passwd para buscar a lista de usuários e usuários do sistema, discriminando ambos

0

Eu quero que o meu grep imprima uma lista de usuários do / etc / passwd, e eu estudei os valores minmax do /etc/login.defs para os que eu quero que o meu grep busque:

# Min/max values for automatic uid selection in useradd
#
UID_MIN          1000
UID_MAX         60000
# System accounts
#SYS_UID_MIN          100
#SYS_UID_MAX          999

Os IDs reais dos usuários começam em 1000 e terminam em 60000, e os IDs de usuário do sistema começam em 100 e terminam em 999.

Então eu fiz meu script ficar assim (aviso de texto em espanhol):

2)
echo 
echo "LISTA DE USUARIOS"
cat /etc/passwd | grep -E "*:[*-6][0-9][0-9][0-9][0-9]:*" | cut -d":" -f1
echo
echo "LISTA DE USUARIOS DEL SISTEMA"
cat /etc/passwd | grep -E "*:[1-9][0-9][0-9]:*" | cut -d":" -f1 
;;

É óbvio que não está funcionando e o grep é muito difícil para mim, então não sei como fazer isso funcionar. Eu tentei (e sempre tentei) ler as soluções dos outros, mas eu acho que vou precisar desta explicação para mim se eu quiser aprender.

Se possível, estou tentando evitar o território perl. Eu não posso lidar com isso muito embora eu entenda o que é famoso.

Qualquer outra coisa que você precise saber para me ajudar, me avise.

Obrigado! (também, primeiro post sempre aqui)

    
por heemayl 24.08.2015 / 21:55

4 respostas

1

Este comando awk faz o que você deseja. Primeiro, defina o separador de registro como : com FS=":" , verifique se o terceiro elemento é 1000-60000 e, se estiver, imprima o elemento 1 (nome de usuário):

awk 'FS=":" {if ($3 > 999 && $3 < 60001) print $1}' < /etc/passwd
    
por stevieb 24.08.2015 / 23:12
1

Outra versão awk , com matrizes. Um pouco mais demorado, mas trabalhando

awk -F':' ' $3 >= 1000 && $1 != "nobody" {i++;humanuser[i]=$1 } $3 < 999 { k++;sysuser[k]=$1} END {printf"****HUMAN USERS\n";for (j=1;j<=i;j++) printf humanuser[j]" "; printf "\n*****SYSTEM USERS\n"; for(m=1;m<=k;m++) printf sysuser[m]" "}' /etc/passwd

Exemplo de saída:

****HUMAN USERS
xieerqi testuser 
*****SYSTEM USERS
root daemon bin sys sync games man lp mail news uucp proxy www-data backup list irc gnats libuuid syslog messagebus usbmux dnsmasq avahi-autoipd kernoops rtkit saned whoopsie speech-dispatcher avahi lightdm colord hplip pulse gdm 
    
por Sergiy Kolodyazhnyy 24.08.2015 / 23:41
0

Você pode usar grep com PerRE Compatible Perl (PCRE):

  • Para obter os nomes de usuários com UID >= 1000 :

    grep -Po '^[^:]+(?=:[^:]+:\d{4,})' /etc/passwd
    
  • Para obter os nomes de usuários com 100 <= UID <= 999 :

    grep -Po '^[^:]+(?=:[^:]+:\d{3})' /etc/passwd
    

Aqui -P indica PCRE, -o indica que vamos receber apenas a parte correspondente.

  • ^[^:]+ obtém o nome de usuário, tudo até primeiro :

  • (?=) é um padrão lookahead positivo de largura zero, estamos usando isso para garantir que correspondamos à parte desejada após o nome de usuário

  • :[^:]+: corresponde a :x: e, em seguida, \d{4,} corresponde a quatro ou mais dígitos ( >=1000 )

  • Por outro lado, :[^:]+: correspondido :x: , em seguida \d{3} corresponde exatamente a três dígitos ( 100 to 999 ).

por heemayl 24.08.2015 / 23:24
0

DISCLAMER : A seguinte resposta de java é para fins educacionais e apenas para diversão de codificação. Se você downvote, explique nos comentários porque.

Código

O código abaixo lê cada linha de /etc/passwd , divide essa linha em strings com : como separador e ordena os usuários dependendo de seu UID em ArrayLists apropriados.

pacote com.askubuntu.users.serg;

import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner;

/**
 * 
 * A program to sort human and system users from /etc/password
 * 
 * @author Serg Kolo
 *
 */
public class UserList {
    private static final String SEPARATOR = "=============";
    private static final int SYS_UID_MAX = 999;
    private static final int UID_MAX = 1000;
    private static final String FILENAME_PASSWD = "/etc/passwd";
    private static final String COLON = ":";
    private static final String NOBODY = "nobody";

    /**
     * 
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) {
        File f = new File(FILENAME_PASSWD);
        try (Scanner readFile = new Scanner(f)) {
            ArrayList<String> humanUsers = new ArrayList<>();
            ArrayList<String> systemUser = new ArrayList<>();

            while (readFile.hasNext()) {
                String[] field = readFile.nextLine().split(COLON);
                int uid = Integer.parseInt(field[2]);

                if (uid >= UID_MAX && (!NOBODY.equals(field[0]))) {
                    humanUsers.add(field[0]);
                } else if (uid <= SYS_UID_MAX) {
                    systemUser.add(field[0]);
                }
            }
            printUsers(humanUsers, "Human Users:");
            printUsers(systemUser, "System Users:");
        } catch (FileNotFoundException e) {
            System.err.println(e.getLocalizedMessage());
        }
    }

    /**
     * 
     * print users
     * 
     * @param users
     * @param header
     */
    private static void printUsers(ArrayList<String> users, String header) {
        System.out.println(header);
        System.out.println(SEPARATOR);
        System.out.println(users);
        System.out.println();
    }
}

Procedimento

  1. Salve o código acima como userlist.java
  2. Compile e execute com seu IDE Java preferido. Se você preferir a linha de comando, faça

    javac UserList.java && java UserList
    
  3. A saída aparecerá no console do seu IDE

Exemplo de saída

Human Users:
=============
[xieerqi, testuser]
System Users:
=============
[root, daemon, bin, sys, sync, games, man, lp, mail, news, uucp, proxy, www-data, backup, list, irc, gnats, libuuid, syslog, messagebus, usbmux, dnsmasq, avahi-autoipd, kernoops, rtkit, saned, whoopsie, speech-dispatcher, avahi, lightdm, colord, hplip, pulse, gdm, sshd]
    
por Sergiy Kolodyazhnyy 26.08.2015 / 08:09