ubuntuusers.de

Überlappende Anmeldezeiten in Ubuntu finden

Status: Ungelöst | Ubuntu-Version: Server 16.10 (Yakkety Yak)
Antworten |

master14785

Anmeldungsdatum:
2. November 2013

Beiträge: 13

Hallo, liebe Community,

ich habe ein kleines Shell-Problem, bei dem ich nicht weiter weiß. Ich möchte mit meinem Shell-Skript die Dateien wtmp unter /var/log analysieren und herausfinden, ob sich Nutzer zur selben Zeit doppelt auf einem Ubuntu-Server angemeldet haben. Allerdings habe ich keine Idee, wie ich mit den Mitteln der Bash, herausfinden kann ob der Nutzer x sich zwei mal zur selben Zeit angemeldet hat. Habe ihr da einen Tipp für mich ?

kleines Bsp:

Nutzer x hat sich am 15.12 um 7:30 bis 10:00 Uhr angemeldet
Nutzer x hat sich am 15.12 um 9:55 bis 11:00 Uhr angemeldet

Hier hat sich der Nutzer x in einem überlappenden Zeitraum angemeldet, aber wie kann ich das in einem Shell-Skript bemerken ?

Vielen dank für eure Hilfe !

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Bestehst Du auf einer Shell-Lösung ? - sonst würde ich es mit awk machen, das ist einfacher:

1
2
3
4
5
6
7
8
9
#!/usr/bin/awk -f

/angemeldet$/  {
        nr[$2]++;
        if( nr[$2] > 1 )  print $1,$2,"ist",nr[$2],"Mal angemeldet."
        }
/abgemeldet$/  {
        nr[$2]--;
        }

Das setzt natürlich voraus, dass es keine irregulären Zustände gibt, wie abschmierende Rechner usw. !
(dann stimmt die Bilanz von an- und abmelden nämlich nicht mehr)

Sowas kann man sicherlich auch per Shell nachbilden, ist mir aber zu mühsam.

LG,

track

p.s.: Oder habe ich das falsch verstanden, und es gibt gar keine Abmelde-Zeilen ?

Ok, dann müsste man also die Uhrzeiten auswerten. (Und was geschieht, wenn man über einen Tageswechsel angemeldet bleibt ?)
Überhaupt müsste man dann mal genauer gucken. Aber auch dann würde ich awk nehmen, denn das kann date/time-Werte verarbeiten.

master14785

(Themenstarter)

Anmeldungsdatum:
2. November 2013

Beiträge: 13

Hallo track,

danke für die Antwort. Leider bin ich gezwungen die Shell zu nehmen ☹

Und Nein, es gibt Anmelde- und Abmeldezeiten.

LG master14785

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21925

Wohnort: Lorchhausen im schönen Rheingau

für genau diese Anzeige gibt es doch

last

master14785

(Themenstarter)

Anmeldungsdatum:
2. November 2013

Beiträge: 13

Genau, aber ich müsste ja, dann in einer Schleife, die vorherigen Anmelde- und Abmeldezeiten mit den aktuellen vergleichen, oder ?

Ich wüsste nicht, wie ich das, mit der Shell machen kann, denn ich könnte ja höchstens die aktuellen Werte auslesen und reagieren, weiß aber nicht, ob der Nutzer sich in der nächsten Zeile doppelt angemeldet hat.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17673

Wohnort: Berlin

Sind Nutzer auch über Mitternacht angemeldet?

Seebär

Avatar von Seebär

Anmeldungsdatum:
2. Mai 2009

Beiträge: 833

Was heißt "nur die aktuellen Werte". Erster Ansatz: Daten besorgen. Mit

1
last --time-format iso  | grep -v reboot

haste schon mal alle "Nutzer" und deren Zeiten. Kannste in File schreiben und dann weiter verarbeiten. Eine Datei sieht dann bspw. so aus:

johndoe  pts/2        :0               2016-12-18T22:41:20+0100 - 2016-12-18T22:41:53+0100  (00:00)
johndoe  pts/1        :0               2016-12-18T22:39:13+0100   gone - no logout
johndoe  tty7         :0               2016-12-18T22:16:45+0100   gone - no logout
johndoe  pts/1        :0               2016-12-18T14:30:20+0100 - 2016-12-18T20:27:46+0100  (05:57)
johndoe  pts/3        :0.0             2016-12-18T13:51:50+0100 - 2016-12-18T13:52:02+0100  (00:00)
johndoe  pts/2        :0               2016-12-18T13:35:33+0100 - 2016-12-18T20:27:56+0100  (06:52)
johndoe  pts/1        :0               2016-12-18T10:07:04+0100 - 2016-12-18T14:30:18+0100  (04:23)
johndoe  tty7         :0               2016-12-18T09:30:23+0100 - down                      (10:57)
johndoe  pts/1        :0               2016-12-17T21:48:07+0100 - 2016-12-17T22:29:38+0100  (00:41)
johndoe  tty7         :0               2016-12-17T19:14:41+0100 - crash                     (03:16)
johndoe  pts/1        :0               2016-12-17T16:04:19+0100 - 2016-12-17T16:04:21+0100  (00:00)

Die Aufgabe wird nun sein:

  • schränke auf User ein / gruppiere (fang erst mal mit einem expliziten User an)

  • iteriere über Zeilen: hier ist das Hauptthema die von/bis Zeiten sauber zu ermitteln (das könnte z.B. mit awk gehen, Sonderfälle mit down etc.. sind zu beachten) und auch dann Intervalle zu vergleichen. Sortiert sind die Daten ja bereits.

master14785

(Themenstarter)

Anmeldungsdatum:
2. November 2013

Beiträge: 13

Danke für die Antworten. Aber leider stehe ich immer noch auf dem Schlauch ☹

Wie kann ich denn die Intervalle sauber vergleichen ?

Das ich die Zeiträume raus greppen kann habe ich hinbekommen.

P.S.: Ja , die Nutzer können auch über Mitternacht angemeldet sein

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

  1. Als Erstes würde ich Dir vorschlagen, die Daten so abzurufen, wie Seebär vorgeschlagen hat. Ist das für Dich annehmbar ?

  2. Dann musst Du in jedem Fall die Ausgabe nach Spalten trennen. Das einfachste dafür wäre awk - willst Du aber nicht, schreibst Du oben ...
    Warum eigentlich nicht ? - ist das bei Dir nicht installiert, oder magst Du es einfach nicht ?
    Natürlich kann man das auch alles mit der Shell in einer read- Schleife machen, mit diversen Parameter Expansions und Array-Zerlegungen. Ist aber deutlich mühsamer.

  3. Um mit den Zeiten gescheit rechnen zu können, empfiehlt sich eine Zerlegung in Sekunden der Epoche. Das geht mit date, oder bei awk mit interner Umwandlung:

    track@track:~$ zeit=2016-12-18T14:30:20+0100
    track@track:~$ date -d "${zeit/T/ }" +%s
    1482067820 

Das so mal vorab als Grobskizze ... (aber vielleicht sollte man auch besser die Zeitlängen in Klammern auswerten ? - das erscheint mir sicherer.)

LG,

track

master14785

(Themenstarter)

Anmeldungsdatum:
2. November 2013

Beiträge: 13

Danke für die Antwort,

Ja, die Daten so abzurufen, wie seebär es gesagt habe, habe ich geschafft.

awk ist schon bei mir installiert, allerdings kenne ich mich nur ganz schlecht mit awk aus.

Kann ich mittels cut. die Datumsangaben raus schneiden und mittels sed ersetzten, indem ich ein date als Ersetzung einsetze ?

Antworten |