Qual é a interpretação de 'awk -F': '' $ 2 ~ “\ $” {print $ 1} '/ etc / shadow'?

3

Eu estava usando o comando para obter a lista de usuários registrados na minha máquina, mas não consigo entender o significado do comando.

awk -F':' ' ~ "$" {print }' /etc/shadow
    
por Prashant Kumar 26.01.2016 / 08:59

4 respostas

7

O comando não mostrará a lista de usuários logados na máquina; na verdade, o comando analisará /etc/shadow , que não tem noção de usuários conectados à máquina.

O comando mostrará a lista de usuários que possuem uma senha definida para sua conta.

Aqui está o detalhamento do comando (observe que isso se refere especificamente à MAWK, que é a versão AWK instalada no Ubuntu, onde a especificação de um padrão entre "" está correta e requer o mesmo escape necessário para um padrão entre // , conforme explicado em man mawk ):

  • -F':' : define o separador de campo (correspondente à variável FS interna do AWK) como : ; isso significa que os campos de cada registro (ou linha neste caso) serão divididos no caractere : e que referências como , , , ... farão referência respectivamente ao primeiro string delimitada do registro atual, a segunda string delimitada por dois pontos do registro atual, a terceira string delimitada por dois pontos do registro atual, ....

  • ~ "$" : este é um chamado "padrão"; é uma condição que é avaliada toda vez que um registro é processado. A condição neste caso é: se o segundo campo corresponder ao regex $ (ou seja, se o segundo campo contiver o caractere $ ), execute a seguinte "ação".

  • {print } : esta é uma chamada "ação"; é um bloco de código que é executado toda vez que a condição anterior é avaliada como TRUE. Imprime o primeiro campo.

por kos 26.01.2016 / 09:16
6

Ele não mostra usuários conectados à sua máquina, mas contas de usuários que possuem uma senha definida. Se você estiver usando gawk em vez de mawk , "$" precisaria ser corrigido para ser /$/ ou "\$" .

  • -F: : use os dois pontos como delimitador
  • ~ /$/ : o segundo campo (senha) contém um cifrão
  • print : imprima o primeiro campo (nome de usuário)

O fato de um usuário estar logado não está armazenado em /etc/shadow .

    
por jlliagre 26.01.2016 / 09:11
1

O significado do seu comando foi explicado bem o suficiente duas vezes, mas eu quero adicionar como você pode realmente listar todos os usuários atualmente logados:

Existe um comando especial para isso, chamado who .

Imprime uma lista de usuários logados e seus estados. Se você adicionar -a , também inclui usuários do sistema; adicionar -u (incluído em -a ) imprime também o processo de login 'PID e o estado inativo.

Eu simplesmente o uso junto com a opção -H para obter algumas manchetes de coluna:

$ who -H
NAME        LINE         TIME             COMMENT
myusername  :0           2016-01-26 08:08 (:0)
myusername  pts/0        2016-01-26 08:16 (:0)

Observe que todos os terminais que você abre também são listados (o valor na coluna LINE é pts/? ).

    
por Byte Commander 26.01.2016 / 09:27
0

O kos já explicou quem o comando que você postou funciona e por que não é útil encontrar usuários logados. Minha resposta pretende responder à segunda metade da sua pergunta - como você realmente encontra a lista de usuários logados? Na verdade, existem várias maneiras.

Comandante Byte já mencionado who .

skolodya@ubuntu:$ who
xieerqi  :0           2016-01-26 10:52 (:0)
xieerqi  pts/6        2016-01-26 10:52 (:0)
xieerqi  pts/0        2016-01-26 10:55 (:0)

Existe outro comando, w , que mostrará uma lista mais detalhada de usuários logados. Isso é muito útil se você estiver trabalhando em um servidor, você pode verificar se um usuário está logado de um endereço IP adequado, quanto CPU seus programas estão usando, etc.

skolodya@ubuntu:$ w
 10:56:23 up 4 min,  3 users,  load average: 0.49, 0.55, 0.26
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
xieerqi  :0       :0               10:52   ?xdm?   1:51   0.33s init --user
xieerqi  pts/6    :0               10:52   30.00s  0.01s  0.01s /bin/mksh
xieerqi  pts/0    :0               10:55    0.00s  0.02s  0.00s w

Por outro lado users produzirá apenas uma lista de nomes de usuários, um por login, então, se eu estiver logado no TTY e com duas guias gnome-terminal , ele mostrará 3 dos meus nomes de usuário.

skolodya@ubuntu:$ users
xieerqi xieerqi xieerqi

Existe também o comando last , que mostra uma lista extensa de logins (incluindo os anteriores). Para os usuários conectados no momento, ele mostra still logged in line. Sabendo que você poderia filtrar a saída de last da seguinte forma:

skolodya@ubuntu:$ last | awk '/still/'                                         
xieerqi  pts/0        :0               Tue Jan 26 10:55   still logged in   
xieerqi  pts/6        :0               Tue Jan 26 10:52   still logged in   
xieerqi  :0           :0               Tue Jan 26 10:52   still logged in 
    
por Sergiy Kolodyazhnyy 26.01.2016 / 19:31