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

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

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. Só consigo visualizar com more e executar o comando lastlog. Preciso ver se os usuários que não fizeram 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 executo o awk imprimindo o primeiro campo e essa é minha lista de usuários simples. Agora eu gostaria basicamente de ver se em/etc/passwd, o shell deles é/bin/bash e se em/etc/shadow, há um !em sua linha. Como posso fazer isso. Eu tentei loops for e loops while e não consigo acertar? Qualquer ajuda seria apreciada.

Responder1

Não tenho certeza se entendi você corretamente. É isso que você procura?

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 pulando a primeira linha (cabeçalho do lastlog)
  • grep -f - /etc/passwd- usar a entrada padrão como um arquivo para obter padrões e procurar padrões em/etc/passwd
  • grep "/bin/bash$"- grep para /bin/bash , $significa EOL.

Algumas notas:

  • lastlog -b 90- isso lhe dá registrosmais velhode 90 dias. Se você quiser que os usuários que fizeram login nos últimos 90 dias usem lastlog -t 90.
  • Eu só optei pela (NR > 1)solução porque estamos usando awkde 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 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 1divide a linha usando :como delimitador e retorna o primeiro campo
  • grep -vsignificainverter correspondência(selecione linhas não correspondentes).

Responder2

O ponto de exclamação, como você notou, precisa ser 'escapado' - tente primeiro inseri-lo com uma barra invertida: \! em vez de ! portanto, não é executado como um comando em vez de ser tratado como texto. Em muitos casos, você também pode citá-lo com aspas simples (não duplas), como: '!' - dependendo do comando que você escolher, um deles deve servir para você.

informação relacionada