Bash-Befehl zum Bestimmen der ersten Anmeldung für einen bestimmten Zeitraum

Bash-Befehl zum Bestimmen der ersten Anmeldung für einen bestimmten Zeitraum

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, lastaber 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 lastundawk

last -R "$USER" | \
    perl -ne 'print unless /wtmp\sbegins/ || /^$/' | \
    awk 'END {print $4,$5,$6}'

last/var/log/wtmpdurchsucht die Datei (oder die durch die Flagge gekennzeichnete Datei ) zurück -fund zeigt eine Liste aller Benutzer an, die sich seit der Erstellung dieser Datei angemeldet (und abgemeldet) haben.

Standardmäßig /var/log/wtmpwird 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 $USERgibt alle Einträge /var/log/wtmpfür den angegebenen Benutzer zurück. Der erste Login wird in der Ausgabe ganz unten angezeigt, daher ENDin meinem awkBefehl.

% 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 undwtmp 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 wtmpProtokolldatei 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 rawtmpzwei Mal aufgerufen. Beim zweiten Mal wird die gespeicherte Rotation der Protokolle verwendet ( /var/log/wtmp.1).

wtmpRotationseinstellungen werden verwaltet von logrotateund 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 tacwird die lastAusgabe umgekehrt.

awkzeigt nur das erste Vorkommen der neuen Zeichenfolge in Spalte 5 an, also die erste Anmeldung eines Monats.

NR !=1wird die Linie beseitigen wtmp begins.

Antwort4

Ein Ansatz, der nicht auf lastoder angewiesen /var/log/wtmpist, 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 touchfü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

verwandte Informationen