Lista de todos os usuários que efetuaram login usando a GUI ou a linha de comando

4

Eu preciso calcular o tempo total que um usuário específico permanece logado por dia. E pare o usuário usando o computador mais do que o tempo permitido desligando o sistema.

uptime não pode ser usado porque este é um computador multiusuário

O comando

last não está fazendo o trabalho porque, como observei, ele armazena apenas dados de usuários que executam o terminal. Se um usuário efetuou login usando a GUI e continua a usar o computador sem executar o terminal, uma entrada é não gravada em / var / log / wtmp.

Existe uma maneira de encontrar as informações de que preciso? Estou usando o Ubuntu 12.04 LTS

    
por Niroshan 30.05.2013 / 18:10

4 respostas

4

who (usando /var/run/utmp ) deve funcionar se o usuário estiver logado via X também.

Em seguida, você pode executar esse script por meio de /etc/crontab a cada minuto . O que faz:

  • faça um loop sobre todos os usuários ( $u ) atualmente conectados em
  • incrementa o número em /var/log/accounting-$u - como isso é feito a cada minuto, o arquivo armazena o tempo total em que o usuário $u está logado até o momento.
  • verifique se $u atingiu o limite ( $allowedtime ), aqui 60 minutos. Se assim for, desligue o sistema ou o que for. 5 minutos antes, envie apenas um aviso (cortesia do @terdon).
  • finalmente, se o usuário $u não foi visto nas últimas 24 horas, exclua /var/log/accounting-$u e o jogo pode começar do começo.

Como mencionei em um comentário, não acho que desligar o sistema não seja uma boa ideia. Especialmente com este script, porque se um usuário efetuar login novamente enquanto as 24 horas ainda não terminarem, a ação de desligamento será disparada após menos de um minuto (quando o cron iniciar accounting.sh da próxima vez).

accounting.sh

#!/bin/bash

accountinglogprefix=/var/log/accounting-
allowedtime=60

for u in $(who | cut -d " " -f 1 | sort | uniq); do

  if [[ -e ${accountinglogprefix}${u} ]]; then
    consumed=$(cat ${accountinglogprefix}${u})
  else
    consumed=0
  fi
  echo -n $(( consumed + 1 )) > ${accountinglogprefix}${u}

  if [[ $consumed -gt $allowedtime ]]; then 
    # time is over, do whatever you want
    echo "Shutting down..."
  elif [[ $consumed -gt $(( allowedtime - 5 )) ]]; then
    # notify the user $u that his time is over in 5 minutes with a suitable command
    echo "Time's up! Shutting down in 5 minutes..."
  fi

  # check if e.g. 24h have passed since the user was last seen
  if [[ $(( $(date +%s ) - $(stat -c %Y ${accountinglogprefix}${u}) )) -gt $(( 24 * 3600 )) ]]; then
    rm ${accountinglogprefix}${u}
  fi

done

Observação: este não é um script totalmente maduro (por exemplo, pronto para copiar e colar) - ele deve apenas demonstrar uma abordagem diferente.

    
por 30.05.2013 / 19:44
3

Em vez de escrever scripts personalizados, é possível usar software disponível e projetado para fazer exatamente isso e muito mais.

por favor, verifique se psacct está disponível para você instalar.

De: link

The psacct package contains several utilities for monitoring process activities, including ac, lastcomm, accton and sa.

The ac command displays statistics about how long users have been logged on.
The lastcomm command displays information about previous executed commands.
The accton command turns process accounting on or off.
The sa command summarizes information about previously executed commmands.
    
por 30.05.2013 / 23:28
1

Você também pode tentar analisar a saída de ps :

$ ps -U terdon -u terdon -o %t 
  ELAPSED
  00:39
  00:06

Neste exemplo, o usuário terdon está executando dois processos, sendo o mais antigo executado por 39 segundos. Portanto, se você analisar isso para obter o processo de execução mais longo (provavelmente o shell de login do usuário), poderá informar por quanto tempo o usuário efetuou login. Neste exemplo, suponho que você queira permitir pelo menos uma hora completa porque eu uso NF>=3 no comando gawk ) mas não mais que 4:

ps -U terdon -u terdon -o %t | grep : | sed 's/ *//g' | 
   gawk -F"[ +:]" 'NF>=3{print $1}' | sort -g | tail -n 1

Este comando irá imprimir as horas de tempo de execução do comando mais longo do usuário terdon. Agora você pode verificar se é mais ou menos que 4:

limit=4;
time=$(ps -U terdon -u terdon -o %t |  grep : | sed 's/ *//g' | 
        gawk -F"[ +:]" 'NF>=3{print $1}' | sort -g | tail -n 1);
 if [[ $time -gt 3 ]]; 
 then echo "Time's up! Shutting down in 5 minutes...";
      shutdown -h +5
fi
    
por 30.05.2013 / 18:48
0

Você pode auditar seu log seguro. Está localizado em:

/var/log/secure

Ele fornece logins e logouts. Além disso, você pode executar o logwatch e lhe dará quem efetuou login pelo período em que você o executou.

Aqui estão mais algumas informações:

1. Recuperar todos os logins bem-sucedidos no sistema

cat /var/log/secure* | grep Accepted > logins.txt

Agora o logins.txt irá conter todos os logins bem-sucedidos para o sistema Redhat linux. Você pode acessar o arquivo e fazer uma pesquisa manual pela primeira vez.

2. Verifique os usuários em tempo real

Outro comando para descobrir os últimos detalhes de login de usuários perticulares que temos os comandos last, lastb que mostra a listagem dos últimos usuários conectados.

O último programa, que imprime um relatório detalhado dos horários dos mais recentes logins de usuários, faz isso digitalizando o arquivo / var / log / wtmp.

A saída inclui os seguintes detalhes:

Username
Tty device number
Login date and time
Logout time
Total working time

Ele também tem uma opção para pesquisar logins no horário específico da seguinte maneira: last -t YYYYMMDDHHMMSS - Exibe o estado dos logins a partir do horário especificado.

Os arquivos usados são: / etc / utmp - Este é um arquivo binário que contém um registro para cada linha tty ativa. / var / adm / wtmp - Mantém o controle dos logins e logouts.

    
por 30.05.2013 / 18:14