Posso alterar o formato de saída do comando “last” para exibir o ano?

7

Estou tentando encontrar uma maneira de relatar o login mais recente para todos os usuários no meu servidor Solaris 10. Estou começando com a saída do comando last . Usando esse comando, recebo uma saída assim:

bd9439    pts/1        vpn-xxx-xx-xxx-x Fri Oct 25 10:46   still logged in
vf7854    pts/1        vpn-xxx-xx-xxx-x Fri Oct 25 10:23 - 10:38  (00:15)

De acordo com a página man, os formatos de data e hora são controlados pela localidade. Eu raramente usei configurações de localidade. Existe algo que eu possa usar para alterar a exibição para incluir a parte "ano" da data? Espero obter uma linha de saída semelhante a esta:

bd9439    pts/1        vpn-xxx-xx-xxx-x Fri Oct 25 2013 10:46   still logged in
vf7854    pts/1        vpn-xxx-xx-xxx-x Fri Oct 25 2013 10:23 - 10:38  (00:15)

Não está claro para mim se a página do manual estava se referindo à saída do comando last ou como os dados são realmente armazenados em / var / adm / wtmpx.

Se houver outra maneira de obter o atributo "último login", ficaremos felizes em saber.

    
por BellevueBob 25.10.2013 / 18:59

3 respostas

6

Em que eu meio que forneço contexto, meio divertido

Você está encontrando um exemplo do motivo principal pelo qual não gosto de gerenciar sistemas Solaris: nada é fácil.

Eu não sei se o local realmente vai fazer nada, exceto alterar a ordem de certas partes do timestamp. Eu estou interessado se alguém souber de uma maneira de persuadir o last do Solaris a dar o ano, mas eu não vou segurar minha respiração. O mantra de desenvolvimento de software da Sun parece ter sido "Tecnicamente funciona".

Sun parece ter desenvolvido algo até o ponto absolutamente necessário, e então praticamente parou por aí. Então você acaba com soluções geralmente aceitas sendo como estas e você apenas mantém uma coleção listada de soluções alternativas para problemas comuns.

A única maneira que encontrei de fazer isso é usar /usr/lib/acct/fwtmp para despejar todo o conteúdo de /var/adm/wtmpx em um canal para outro programa que eu uso para manipular a saída de texto ( grep , tac , sed , etc).

Bônus: como buscar o final do arquivo e apenas voltar pelo comprimento fixo do registro wtmpx seria pedir muito, fwtmp só pode imprimir o conteúdo de wtmpx conforme eles aparecem no arquivo. Então você tem que usar alguns outros meios (provavelmente tac ) de reverter as linhas, a menos que você esteja realmente interessado nas informações mais antigas (que é o caso de uso provável menor , mas eu discordo).

Dependendo de quanto tempo seu sistema está em operação wtmpx pode ser um pouco grande, então você pode querer ir tomar uma xícara de café, talvez verificar se seus pneus estão insuficientemente inflados, e talvez ler um livro ou dois enquanto você está nisso.

A resposta real à sua pergunta:

Este é um comando que emula last de forma que é utilizável para a maioria das pessoas interessadas em ver os registros de login:

# cat /var/adm/wtmpx | /usr/lib/acct/fwtmp | tac | head 

Você notará que tenho que canalizar wtmpx , pois eles não fornecem um meio de simplesmente fornecer o arquivo para fwtmp . Isso porque alimentá-lo no via stdin Technically Works ™ na maioria dos casos de uso e eles não precisariam escrever algumas linhas extras de código. Então, eles preferem apenas fazer os administradores fazerem isso.

Esta é uma saída de exemplo dos itens acima nos sistemas que eu cuido:

[root@atum root]# cat /var/adm/wtmpx | /usr/lib/acct/fwtmp | tac | head
jadavis6                         ts/1 pts/1                                19410  7 0000 0000 1382723864 157168 0 19 ditirlns01.xxx.edu Fri Oct 25 13:57:44 2013
jadavis6                              sshd                                 19404  7 0000 0000 1382723864 133973 0 19 ditirlns01.xxx.edu Fri Oct 25 13:57:44 2013
oracle                                sshd                                  6640  8 0000 0000 1382713401 157107 0 0  Fri Oct 25 11:03:21 2013
oracle                           ts/1 pts/1                                 6647  8 0000 0000 1382713401 150489 0 0  Fri Oct 25 11:03:21 2013
oracle                           ts/1 pts/1                                 6647  7 0000 0000 1382712445 24488 0 23 a0003040148735.xxx.edu Fri Oct 25 10:47:25 2013
oracle                                sshd                                  6640  7 0000 0000 1382712442 304729 0 23 a0003040148735.xxx.edu Fri Oct 25 10:47:22 2013
jadavis6                              sshd                                 23537  8 0000 0000 1382560970 410725 0 0  Wed Oct 23 16:42:50 2013
jadavis6                         ts/1 pts/1                                23544  8 0000 0000 1382560970 404795 0 0  Wed Oct 23 16:42:50 2013
jadavis6                         ts/1 pts/1                                23544  7 0000 0000 1382552999 619524 0 19 ditirlns01.xxx.edu Wed Oct 23 14:29:59 2013
jadavis6                              sshd                                 23537  7 0000 0000 1382552999 602215 0 19 ditirlns01.xxx.edu Wed Oct 23 14:29:59 2013
[root@atum root]#

EDITAR:

Eu sei que estou me lamentando sobre algo pequeno lá em cima, mas depois de um tempo eu me canso de cada pequena coisa (como simplesmente perguntar "o que é o ano?") se transformando em uma hora de googlefest ou algo mais ou menos conhecimento apenas tribal (como a existência de fwtmp ).

    
por 25.10.2013 / 20:21
2

O last do GNU / Linux oferece a opção -F . Eu ficaria surpreso se Solaris, no entanto.

Internamente, o arquivo wtmp deve ter registros de data e hora de época e, portanto, se você quiser gravar algo em C ou Perl, pode criar seu próprio comando last . Você precisará examinar o arquivo de cabeçalho C apropriado para a estrutura. O wtmp é um arquivo "binário" e não é passível de avaliação com ferramentas de análise padrão.

Considere periodicamente arquivar e truncar seu arquivo wtmp para saber em que ano ele se aplica.

    
por 25.10.2013 / 19:16
1

Eu tive um caso semelhante, mas precisava da data de login no meu formato personalizado. Isso funciona para mim:

date -d "'last -F | head -n1 | sed -r 's/.*\.[0-9]+\s+//' | sed -r 's/\s(still|-).*//''" +"%F_%R"
    
por 14.01.2016 / 15:19