4

Мне нужно рассчитать общее время, в течение которого конкретный пользователь остается в системе в день. И прекратите использование пользователем компьютера больше времени, отведенного на выключение системы.

uptime нельзя использовать, так как это многопользовательский компьютер

last команда не выполняет работу, потому что, как я заметил, она хранит данные только пользователей, которые запускают терминал. Если пользователь вошел в систему с помощью графического интерфейса и продолжает использовать компьютер без запуска терминала, запись не записывается в /var /log /wtmp.

Есть ли способ найти нужную мне информацию? Я использую Ubuntu 12.04 LTS

4 ответа4

4

who (использующий /var/run/utmp) должен работать, если пользователь также вошел в систему через X.

Затем вы можете запускать этот скрипт через /etc/crontab каждую минуту. Что оно делает:

  • Зацикливаться на всех пользователях ($u), вошедших в данный момент
  • увеличивает число в /var/log/accounting-$u - так как это делается каждую минуту, в файле сохраняется общее время, в течение которого пользователь $u вошел в систему.
  • проверьте, достигло ли $u лимита ($allowedtime), здесь 60 минут. Если так, выключите систему или что-то еще. На 5 минут раньше отправляю только предупреждение (любезно предоставлено @terdon).
  • наконец, если пользователя $u не видели в течение последних 24 часов, удалите /var/log/accounting-$u и игра может начаться с самого начала.

Как я упоминал в комментарии, я не думаю, что выключение системы - не очень хорошая идея. Особенно с этим сценарием, потому что, если пользователь снова входит в систему, пока 24 часа еще не закончились, действие выключения будет запущено менее чем через минуту (когда cron запустит accounting.sh в следующий раз).


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

Примечание: это не полностью зрелый сценарий (т.е. готовый для копирования и вставки) - он должен просто демонстрировать другой подход.

3

Вместо написания пользовательских сценариев можно использовать доступное программное обеспечение, предназначенное именно для этого и даже больше.

пожалуйста, проверьте, доступен ли psacct для установки.

От: http://www.cyberciti.biz/tips/howto-log-user-activity-using-process-accounting.html

Пакет psacct содержит несколько утилит для мониторинга процессов, в том числе ac, lastcomm, accton и 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.
1

Вы также можете попытаться проанализировать вывод ps:

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

В этом примере пользователь terdon выполняет два процесса, самый старый из которых работает в течение 39 секунд. Итак, если вы проанализируете это, чтобы получить самый продолжительный процесс (вероятно, оболочка входа пользователя), вы можете сказать, как долго пользователь вошел в систему. В этом примере я предполагаю, что вы хотите разрешить хотя бы полный час (поэтому я использую NF>=3 в команде gawk ), но не более 4:

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

Эта команда напечатает истекшие часы самой длительной команды пользователя terdon. Теперь вы можете проверить, больше или меньше 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
0

Вы можете проверить ваш безопасный журнал. Он расположен в:

/ Вар / журнал / безопасный

Это дает вам логины и выходы из системы. Также вы можете запустить logwatch, и он даст вам, кто вошел в систему в течение периода, в течение которого вы запускаете его.

Вот еще немного информации:

1. Получить все успешные входы в систему

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

Теперь logins.txt будет содержать все успешные входы в систему Redhat Linux. Вы можете просмотреть файл и сначала найти руководство.

2. Проверка пользователей в обычное время

Другая команда, чтобы узнать последние данные для входа в пользователи perticular, у нас есть команда last, lastb, которая показывает список последних зарегистрированных пользователей.

Последняя программа, которая печатает подробный отчет о времени последних входов пользователей, делает это путем сканирования файла /var /log /wtmp.

Вывод включает в себя следующие детали:

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

Он также имеет возможность поиска входов в систему в определенное время следующим образом: last -t ГГГГММДДЧЧММСС - отображать состояние входов в систему за указанное время.

Файлы, используемые в этом:/etc/utmp - это двоичный файл, который содержит запись для каждой активной строки tty. /var/adm/wtmp - отслеживает как входы, так и выходы из системы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .