Команда Bash для определения первого входа для определенного периода времени

Есть ли способ определить, например, что текущий день является первым входом для этого месяца? Я пытаюсь использовать его в своем сценарии. Я знаком с last, но это не похоже на команду для этой работы.

Давайте возьмем это для примера:

Если сегодня первый вход месяца, эхо «первый!» else echo "nope"

Пример сценария:

2 июля - мой первый логин за июль, я зашел в систему 5 раз в этот день. Он должен только эхо «первым» на моем первом входе и «nope» на последующие 4.

1
задан 15 July 2015 в 14:22

3 ответа

Вы можете проанализировать текущий файл журнала wtmp с помощью rawtmp.

Сначала установите инструмент:

sudo apt-get install sac

Затем используйте следующую команду:

(rawtmp -s 07/01/15; rawtmp -s 07/01/15 -w /var/log/wtmp.1) \
| grep 'LOGIN Process' | sort | head -n 1 | awk -F: '{print $1}' \
| perl -pe 's/(\d+)/localtime($1)/e' 

Для меня вывод:

Wed Jul  1 08:40:58 2015

Чтобы получить записи за полный месяц, команда вызывает rawtmp два раза. Второй раз с использованием сохраненного вращения журналов (/var/log/wtmp.1).

wtmp параметры вращения управляются с помощью logrotate и по умолчанию на ubuntu они хранятся в /etc/logrotate.conf: [!d5 ]

# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
    rotate 1
}
1
ответ дан 23 May 2018 в 19:03
  • 1
    @krato Я обновил свой ответ, чтобы ловить логины на весь месяц (включая 1-й день) – Sylvain Pineau 15 July 2015 в 14:46
last <username> | tac | awk '{
    if ( b != $5 && NR !=1 ){
      b=$5; print $4,$5,$6,$7,$8,$9,$10
    }
}'

Это будет первый вход в каждый месяц в last.

Здесь tac отменит вывод last.

awk покажет только первое вхождение новой строки в столбце 5, которое является первым логином месяца.

NR !=1 удалит строку wtmp begins.

0
ответ дан 23 May 2018 в 19:03
  • 1
    С вашей командой у меня есть три разные строки, например: Wed Jul 1 08:28 - 11:27 (02:58) Jul 9 15:29 - 16:03 (00:33) Thu Jul 9 16:21 - down (00:06) – A.B. 15 July 2015 в 16:35
  • 2
    Я не знаю почему. Но для меня это прекрасно работает. – 7171u 15 July 2015 в 17:05

Подход, не полагающийся на last или /var/log/wtmp, если скрипт запускается только один раз после входа в систему, заключается в создании пустого файла. В следующем прогоне, если время его создания меньше первого для первого момента текущего месяца или если файл не существует, тогда ècho "first!". В любом случае обновите или создайте файл с touch в следующий раз.

MONTH=`/bin/tempfile`
touch -d "01 $(date +'%b %y')" "$MONTH"
if [ ~/.lastlogin -ot "$MONTH" ]
then echo "first!"
fi
rm "$MONTH"
touch ~/.lastlogin
0
ответ дан 23 May 2018 в 19:03

Другие вопросы по тегам:

Похожие вопросы: