
Gibt es eine Möglichkeit, beispielsweise festzustellen, dass der aktuelle Tag der erste Login für diesen Monat ist? Ich versuche, dies in meinem Skript zu verwenden. Ich kenne mich damit aus, last
aber es scheint nicht der richtige Befehl für diesen Job zu sein.
Nehmen wir Folgendes als Beispiel:
- Wenn heute die erste Anmeldung des Monats ist, geben Sie „Erster!“ als Echo aus.
- sonst echo "nö"
Beispielszenario:
Der 2. Juli ist mein erster Login im Monat Juli, ich habe mich an diesem Tag fünfmal angemeldet. Bei meinem ersten Login darf nur „first“ und bei den darauffolgenden vier Logins „nope“ ausgegeben werden.
Antwort1
Verwenden last
undawk
last -R "$USER" | \
perl -ne 'print unless /wtmp\sbegins/ || /^$/' | \
awk 'END {print $4,$5,$6}'
last
/var/log/wtmp
durchsucht die Datei (oder die durch die Flagge gekennzeichnete Datei ) zurück -f
und zeigt eine Liste aller Benutzer an, die sich seit der Erstellung dieser Datei angemeldet (und abgemeldet) haben.
Standardmäßig /var/log/wtmp
wird jeden neuen Monat Folgendes erstellt:
% awk '/\/var\/log\/wtmp/,/}/' /etc/logrotate.conf
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
last -R $USER
gibt alle Einträge /var/log/wtmp
für den angegebenen Benutzer zurück. Der erste Login wird in der Ausgabe ganz unten angezeigt, daher END
in meinem awk
Befehl.
% last -R "$USER"
aboettge pts/1 Wed Jul 15 12:04 still logged in
aboettge pts/1 Wed Jul 15 11:29 - 12:04 (00:34)
aboettge pts/1 Wed Jul 15 08:08 - 11:29 (03:21)
aboettge pts/1 Wed Jul 15 08:08 - 08:08 (00:00)
aboettge pts/1 Wed Jul 15 08:07 - 08:08 (00:00)
aboettge tty2 Wed Jul 15 08:03 still logged in
aboettge pts/1 Tue Jul 14 12:58 - down (00:53)
aboettge pts/1 Tue Jul 14 09:06 - 12:58 (03:51)
aboettge pts/1 Tue Jul 14 09:03 - 09:06 (00:02)
aboettge pts/1 Tue Jul 14 08:23 - 09:03 (00:40)
aboettge pts/1 Tue Jul 14 08:22 - 08:23 (00:00)
aboettge tty2 Tue Jul 14 08:22 - down (05:28)
aboettge pts/1 Mon Jul 13 12:01 - 16:26 (04:24)
aboettge pts/1 Mon Jul 13 11:49 - 11:59 (00:10)
aboettge pts/1 Mon Jul 13 11:46 - 11:49 (00:02)
aboettge tty2 Mon Jul 13 11:44 - down (04:42)
aboettge pts/2 Mon Jul 13 11:26 - 11:35 (00:08)
aboettge tty2 Mon Jul 13 11:25 - down (00:09)
aboettge pts/3 Fri Jul 10 14:26 - 14:28 (00:01)
aboettge pts/3 Fri Jul 10 14:23 - 14:26 (00:03)
aboettge pts/2 Fri Jul 10 13:34 - 15:27 (01:53)
aboettge pts/2 Fri Jul 10 13:31 - 13:31 (00:00)
aboettge pts/2 Fri Jul 10 13:25 - 13:30 (00:05)
aboettge pts/2 Fri Jul 10 10:28 - 13:19 (02:50)
aboettge pts/1 Fri Jul 10 08:35 - 15:27 (06:52)
aboettge tty2 Fri Jul 10 08:00 - down (07:28)
aboettge pts/1 Thu Jul 9 16:25 - 16:27 (00:01)
aboettge tty2 Thu Jul 9 16:21 - down (00:06)
aboettge tty1 Thu Jul 9 16:03 - crash (00:00)
aboettge tty1 Thu Jul 9 15:29 - 16:03 (00:33)
aboettge pts/1 Thu Jul 9 14:32 - 14:32 (00:00)
aboettge pts/1 Thu Jul 9 08:51 - 08:51 (00:00)
aboettge pts/1 Thu Jul 9 08:51 - 08:51 (00:00)
aboettge pts/1 Thu Jul 9 08:50 - 08:51 (00:00)
aboettge pts/1 Thu Jul 9 08:46 - 08:46 (00:00)
aboettge pts/1 Thu Jul 9 08:46 - 08:46 (00:00)
aboettge pts/1 Thu Jul 9 08:45 - 08:45 (00:00)
aboettge pts/1 Thu Jul 9 08:44 - 08:44 (00:00)
aboettge pts/1 Thu Jul 9 08:42 - 08:42 (00:00)
aboettge pts/1 Thu Jul 9 08:42 - 08:42 (00:00)
aboettge pts/1 Thu Jul 9 08:42 - 08:42 (00:00)
aboettge pts/1 Thu Jul 9 08:41 - 08:41 (00:00)
aboettge pts/1 Thu Jul 9 08:41 - 08:41 (00:00)
aboettge pts/1 Thu Jul 9 08:40 - 08:41 (00:00)
aboettge pts/1 Thu Jul 9 08:39 - 08:39 (00:00)
aboettge pts/1 Thu Jul 9 08:38 - 08:38 (00:00)
aboettge pts/1 Thu Jul 9 08:36 - 08:36 (00:00)
aboettge pts/1 Thu Jul 9 08:36 - 08:36 (00:00)
aboettge pts/1 Thu Jul 9 08:36 - 08:36 (00:00)
aboettge pts/1 Thu Jul 9 08:35 - 08:35 (00:00)
aboettge pts/1 Thu Jul 9 08:35 - 08:35 (00:00)
aboettge pts/2 Thu Jul 9 07:50 - 16:03 (08:12)
aboettge :0 Thu Jul 9 07:50 - crash (08:13)
aboettge pts/1 Wed Jul 8 16:13 - 16:27 (00:13)
aboettge pts/2 Wed Jul 8 13:47 - 16:27 (02:39)
aboettge pts/1 Wed Jul 8 11:30 - 14:14 (02:44)
aboettge pts/1 Wed Jul 8 08:18 - 11:29 (03:11)
aboettge :0 Wed Jul 8 08:02 - crash (23:47)
aboettge pts/2 Tue Jul 7 08:54 - 08:55 (00:00)
aboettge pts/1 Tue Jul 7 08:02 - 13:13 (05:10)
aboettge :0 Tue Jul 7 07:50 - down (05:23)
aboettge pts/1 Mon Jul 6 09:55 - 14:48 (04:53)
aboettge :0 Mon Jul 6 08:27 - crash (23:19)
aboettge pts/2 Fri Jul 3 07:52 - 15:30 (07:38)
aboettge :0 Fri Jul 3 07:51 - down (07:40)
aboettge pts/2 Thu Jul 2 15:16 - 15:18 (00:01)
aboettge pts/2 Thu Jul 2 15:07 - 15:07 (00:00)
aboettge pts/1 Thu Jul 2 14:46 - 16:21 (01:35)
aboettge pts/1 Thu Jul 2 09:53 - 09:53 (00:00)
aboettge pts/2 Thu Jul 2 08:00 - 14:41 (06:40)
aboettge :0 Thu Jul 2 08:00 - crash (23:47)
aboettge pts/5 Wed Jul 1 14:16 - 14:38 (00:21)
aboettge pts/3 Wed Jul 1 14:01 - 16:10 (02:09)
aboettge pts/2 Wed Jul 1 13:27 - 16:10 (02:42)
aboettge pts/1 Wed Jul 1 13:22 - 16:10 (02:48)
aboettge :0 Wed Jul 1 13:15 - 16:21 (03:05)
aboettge pts/2 Wed Jul 1 11:30 - 11:36 (00:06)
aboettge pts/1 Wed Jul 1 11:29 - 13:02 (01:32)
aboettge pts/1 Wed Jul 1 11:27 - 11:29 (00:01)
aboettge pts/2 Wed Jul 1 08:28 - 11:27 (02:58)
wtmp begins Wed Jul 1 08:28:18 2015
Beispiel
% last -R "$USER" | perl -ne 'print unless /wtmp\sbegins/ || /^$/' | awk 'END {print $4,$5,$6}'
Jul 1 08:28
Abbauen
% last -R "$USER"
siehe oben
perl -ne 'print unless /wtmp\sbegins/ || /^$/'
entfernt leere Zeilen und
wtmp begins …
awk 'END {print $4,$5,$6}'
druckt die Felder 4, 5 und 6 aus der letzten Zeile, das Standardtrennzeichen ist
(ein Leerzeichen)
Antwort2
Sie können die aktuelle wtmp
Protokolldatei mit analysieren rawtmp
.
Installieren Sie zuerst das Tool:
sudo apt-get install sac
Verwenden Sie dann den folgenden Befehl:
(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'
Bei mir wird folgendes ausgegeben:
Wed Jul 1 08:40:58 2015
Um sicherzugehen, dass Einträge für den gesamten Monat vorliegen, wird der Befehl rawtmp
zwei Mal aufgerufen. Beim zweiten Mal wird die gespeicherte Rotation der Protokolle verwendet ( /var/log/wtmp.1
).
wtmp
Rotationseinstellungen werden verwaltet von logrotate
und unter Ubuntu standardmäßig hier gespeichert /etc/logrotate.conf
:
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
Antwort3
last <username> | tac | awk '{
if ( b != $5 && NR !=1 ){
b=$5; print $4,$5,$6,$7,$8,$9,$10
}
}'
Dadurch wird die erste Anmeldung jeden Monats in angezeigt last
.
Hier tac
wird die last
Ausgabe umgekehrt.
awk
zeigt nur das erste Vorkommen der neuen Zeichenfolge in Spalte 5 an, also die erste Anmeldung eines Monats.
NR !=1
wird die Linie beseitigen wtmp begins
.
Antwort4
Ein Ansatz, der nicht auf last
oder angewiesen /var/log/wtmp
ist, wenn das Skript nur einmal direkt nach der Anmeldung ausgeführt wird, besteht darin, eine leere Datei zu erstellen. Wenn beim nächsten Ausführen die Erstellungszeit vor eins für den ersten Moment des aktuellen Monats liegt oder wenn die Datei nicht existiert, dann ècho "first!"
. Aktualisieren oder erstellen Sie die Datei in beiden Fällen touch
für das nächste Mal mit .
MONTH=`/bin/tempfile`
touch -d "01 $(date +'%b %y')" "$MONTH"
if [ ~/.lastlogin -ot "$MONTH" ]
then echo "first!"
fi
rm "$MONTH"
touch ~/.lastlogin