Combine uma lista de usuários com o / etc / passwd

1

Eu tenho uma lista simples de usuários de uma coluna. Vem do comando lastlog. Preciso saber se essas contas estão desativadas e não tenho acesso root. Eu só posso ver com mais e executar o comando lastlog. Preciso ver se os usuários que não efetuaram login nos últimos 90 dias ainda estão ativos.

Até agora eu executo

sudo lastlog -b 90

O que me dá os usuários que fizeram login ... nos últimos 90 dias. Agora eu apenas corro através do awk imprimindo o primeiro campo e essa é a minha simples lista de usuários. Agora eu gostaria basicamente de ver se em / etc / passwd, seu shell é / bin / bash e se em / etc / shadow, existe um ! em sua linha. Como posso fazer isso. Eu tentei por loops e loops enquanto e não consigo acertar? Qualquer ajuda seria apreciada.

    
por unixpipe 04.09.2014 / 01:05

2 respostas

1

Não sei se entendi bem. É para isso que você está depois?

lastlog -b 90 | awk '{if (NR > 1) print $1 }' | grep -f - /etc/passwd | grep "/bin/bash$"

Aqui está o detalhamento:

  • awk '{if (NR > 1) print $1 }' - imprime a primeira coluna ignorando a primeira linha (cabeçalho do último registro)
  • grep -f - /etc/passwd - use a entrada padrão como um arquivo para obter padrões e pesquisar padrões em /etc/passwd
  • grep "/bin/bash$" - grep para / bin / bash, $ significa EOL .

Algumas notas:

  • lastlog -b 90 - que fornece registros mais antigos de 90 dias. Se você quiser que os usuários que fizeram login nos últimos 90 dias, use lastlog -t 90 .
  • Eu só fui com (NR > 1) solution porque estamos usando awk de qualquer maneira. Uma maneira mais sucinta de pular a primeira linha de um arquivo seria sed 1d .

EDITAR

Você pode usar um idioma semelhante se também quiser filtrar os registros com ! de / etc / shadow. Então o comando completo seria:

lastlog -b 90 | awk '{if (NR > 1) print $1 }' | grep -f - /etc/passwd | grep "/bin/bash$" | cut -d ':' -f 1 | grep -f - /etc/shadow | grep -v ":\!:"
  • cut -d':' -f 1 divide a linha usando : como um delimitador e retorna o primeiro campo
  • grep -v significa inverter correspondência (selecione linhas não correspondentes).
por 04.09.2014 / 22:01
0

O ponto de exclamação, como você percebeu, precisa ser 'escapado' - tente inserir primeiro as pesquisas dele com uma barra invertida: \! ao invés de ! por isso não o executa como um comando em vez de ser tratado como texto. Você também pode, em muitos casos, citá-lo com aspas simples (não duplas) da seguinte forma: '!' - dependendo do comando escolhido, um deles deve fazer isso por você.

    
por 04.09.2014 / 03:02