Определите, является ли текущий вход в систему первым в течение месяца в Bash

Это - продолжение моего сообщения здесь

Хотя A.B. предоставил мне корректный ответ, который является путем использования вывода last и проверка, если это - текущий журнал в, это не решило мою проблему. Я проверил после входа в систему вывод last и это не имело нижней строки, чтобы быть первым входом в систему в течение месяца. Вместо этого первый вход в систему находится на вершине (выше логинов на июль).

Мне не удалось сохранить снимок экрана, с тех пор на данный момент lastвывод стер весь июль. Это похоже /var/log/wtmp не обновлялся немедленно при входе в систему, которым я ожидал, что это будет. В некоторых комментариях, предложенных в части 1 моего сообщения, говорится, что это обновляет каждый первый день месяца. Так или иначе я просто хочу запустить некоторый скрипт при запуске, который говорит мне, если мой текущий вход в систему является первым входом в систему в течение месяца.

Вот простой сценарий, который я записал:

firstLogin=$(last | tail -3 | head -1)

# check if "still logged in" (this is current log in)
if [[ $(grep "still" <<< $firstLogin) ]]; then
    notify-send "first login!!!!"
fi

Кто-либо может предложить путь к этому? Я ценил бы любую справку.

Править: Как Вы, возможно, видели в сценарии в качестве примера, я пытаюсь сделать это без справки любых временных файлов. Однако, если бы нет никакого другого способа сделать это без временных файлов, я, вероятно, просто пошел бы с ним.

0
задан 13 April 2017 в 15:24

2 ответа

Почему бы не упростить жизнь для себя и примечания в файле при каждом входе в систему текущий месяц и тест его предыдущее значение?

, Когда Вы входите в систему и Ваша оболочка является ударом, это считает файлы ~/.bash_profile, ~/.bash_login, и ~/.profile.

Так, например, добавляют к любому из них строки:

now=$(date +%m)
last=$(<~/.mylastlogin)
if [ $now != "$last" ]
then notify-send "first login!!!!"
     echo $now >~/.mylastlogin
fi
unset now last
<час>

Для предотвращения использования временного файла можно использовать любой существующий файл, например, ~/.profile сам файл. Всего touch это при каждом входе в систему после сравнения ls -l время производится. Например:

now=$(date +%m)
last=$(ls -ld --time-style=+%m ~/.profile | awk '{print $6}')
if [ $now != "$last" ]
then notify-send "first login!!!!"
     touch ~/.profile
fi
unset now last
2
ответ дан 29 July 2019 в 21:33

запрашивают логины для вашего пользователя только за текущий месяц и подсчитывают их.

если более одного, вы уже входили в систему в этом месяце.

единственная строка для копирования / вставки в ваш терминал:

[ $(last -R "$USER" | grep -c $(LC_ALL=en_US.utf8 date +%b)) -gt 1 ] && echo 'nope' || echo 'first login'

протестировано с помощью этого вывода из последней команды:

root     pts/1        Tue Feb 18 13:38   still logged in   
root     pts/1        Tue Feb 18 13:17 - 13:38  (00:20)    
root     pts/0        Tue Feb 18 07:27   still logged in   
root     pts/1        Mon Feb 17 09:29 - 17:08  (07:39)    
root     pts/0        Fri Jan 31 09:50 - 13:54  (04:03)    
root     pts/1        Tue Jan 28 09:19 - 17:11  (07:52)    
root     pts/0        Mon Jan 27 13:58 - 18:01 (3+04:02)   
root     pts/0        Wed Dec 18 11:54 - 12:18  (00:24)    
root     pts/0        Tue Dec 17 17:24 - 19:27  (02:02)    
root     pts/1        Tue Dec 17 16:30 - 16:44  (00:13)    

или при изменении вашего примера сценария:

countLogin=$(last -R "$USER" | grep -c $(LC_ALL=en_US.utf8 date +%b))

# check if equals 1
if [ "$countLogin" -eq 1 ] ; then
    notify-send "first login!!!!"
fi
0
ответ дан 18 February 2020 в 17:02

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

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