Kann ich das Ausgabeformat des Befehls "last" ändern, um das Jahr anzuzeigen?

7

Ich versuche, eine Möglichkeit zu finden, über die letzte Anmeldung für alle Benutzer auf meinem Solaris 10-Server zu berichten. Ich beginne mit der Ausgabe des lastBefehls. Mit diesem Befehl erhalte ich folgende Ausgabe:

bd9439    pts/1        vpn-xxx-xx-xxx-x Fri Oct 25 10:46   still logged in
vf7854    pts/1        vpn-xxx-xx-xxx-x Fri Oct 25 10:23 - 10:38  (00:15)

Laut Manpage werden Datums- und Uhrzeitformate vom Gebietsschema gesteuert. Ich habe sehr selten Gebietsschemaeinstellungen verwendet. Kann ich etwas verwenden, das die Anzeige so ändert, dass sie den Teil "Jahr" des Datums enthält? Ich hoffe, eine ähnliche Ausgabezeile zu erhalten:

bd9439    pts/1        vpn-xxx-xx-xxx-x Fri Oct 25 2013 10:46   still logged in
vf7854    pts/1        vpn-xxx-xx-xxx-x Fri Oct 25 2013 10:23 - 10:38  (00:15)

Mir ist nicht klar, ob sich die Manpage auf die Ausgabe des lastBefehls selbst bezieht oder wie die Daten tatsächlich in / var / adm / wtmpx gespeichert sind.

Wenn es einen anderen Weg gibt, um dieses Attribut "Letzte Anmeldung" zu erhalten, würde ich es gerne lernen.

BellevueBob
quelle

Antworten:

7

In dem ich halb Kontext zur Verfügung stelle, halb schimpfe

Sie stoßen auf ein Beispiel für den Hauptgrund, warum ich Solaris-Systeme nicht gerne verwalte: Nichts ist jemals einfach.

Ich weiß nicht, ob das Gebietsschema wirklich etwas anderes tun wird, als die Reihenfolge bestimmter Teile des Zeitstempels zu ändern. Ich bin interessiert, ob jemand einen Weg kennt, Solaris dazu lastzu bringen, das Jahr zu geben, aber ich werde nicht den Atem anhalten. Suns Mantra für die Softwareentwicklung scheint "It Technically Works" gewesen zu sein.

Sun scheint so ziemlich alles bis zu dem Punkt entwickelt zu haben, der absolut von ihnen verlangt wird, und hat dann dort so ziemlich aufgehört. Sie erhalten also allgemein akzeptierte Lösungen wie diese und führen nur eine Liste mit Problemumgehungen für häufig auftretende Probleme.

Der einzige Weg , den ich je gefunden habe , dies zu tun , ist zu verwenden , um /usr/lib/acct/fwtmpden gesamten Inhalt der Dump /var/adm/wtmpxauf ein Rohr in ein anderes Programm , dass ich für die Manipulation der Textausgabe verwenden ( grep, tac, sed, usw.).

Bonus: Da das Suchen nach dem Ende der Datei und das Zurückbewegen um die festgelegte wtmpxDatensatzlänge zu viel verlangt, fwtmpkann nur der Inhalt wtmpxso ausgedruckt werden, wie er in der Datei erscheint. Sie müssen also (wahrscheinlich tac) andere Mittel verwenden, um die Zeilen umzukehren, es sei denn, Sie interessieren sich tatsächlich für die ältesten Informationen (was der am wenigsten wahrscheinliche Anwendungsfall ist, aber ich schweife ab).

Abhängig davon, wie lange Ihr System in Betrieb war, kann wtmpxes sehr groß sein. Vielleicht möchten Sie sich eine Tasse Kaffee holen, nachsehen, ob Ihre Reifen zu wenig Luft haben, und vielleicht ein oder zwei Bücher lesen, während Sie unterwegs sind daran.

Die tatsächliche Antwort auf Ihre Frage:

Dies ist ein Befehl, der lastauf eine Weise emuliert wird, die für die meisten Benutzer von Anmeldedatensätzen verwendet werden kann:

# cat /var/adm/wtmpx | /usr/lib/acct/fwtmp | tac | head 

Sie werden feststellen, dass ich mich melden muss, wtmpxda sie Ihnen nicht die Möglichkeit geben, nur die Datei zu geben fwtmp. Das liegt daran, dass es in stdinden meisten Anwendungsfällen über Technically Works ™ eingespeist wird und sie nicht ein paar zusätzliche Codezeilen schreiben müssten. Also würden sie Admins lieber dazu bringen, das zu tun.

Dies ist eine Beispielausgabe des oben genannten auf einem der Systeme, die ich betreue:

[root@atum root]# cat /var/adm/wtmpx | /usr/lib/acct/fwtmp | tac | head
jadavis6                         ts/1 pts/1                                19410  7 0000 0000 1382723864 157168 0 19 ditirlns01.xxx.edu Fri Oct 25 13:57:44 2013
jadavis6                              sshd                                 19404  7 0000 0000 1382723864 133973 0 19 ditirlns01.xxx.edu Fri Oct 25 13:57:44 2013
oracle                                sshd                                  6640  8 0000 0000 1382713401 157107 0 0  Fri Oct 25 11:03:21 2013
oracle                           ts/1 pts/1                                 6647  8 0000 0000 1382713401 150489 0 0  Fri Oct 25 11:03:21 2013
oracle                           ts/1 pts/1                                 6647  7 0000 0000 1382712445 24488 0 23 a0003040148735.xxx.edu Fri Oct 25 10:47:25 2013
oracle                                sshd                                  6640  7 0000 0000 1382712442 304729 0 23 a0003040148735.xxx.edu Fri Oct 25 10:47:22 2013
jadavis6                              sshd                                 23537  8 0000 0000 1382560970 410725 0 0  Wed Oct 23 16:42:50 2013
jadavis6                         ts/1 pts/1                                23544  8 0000 0000 1382560970 404795 0 0  Wed Oct 23 16:42:50 2013
jadavis6                         ts/1 pts/1                                23544  7 0000 0000 1382552999 619524 0 19 ditirlns01.xxx.edu Wed Oct 23 14:29:59 2013
jadavis6                              sshd                                 23537  7 0000 0000 1382552999 602215 0 19 ditirlns01.xxx.edu Wed Oct 23 14:29:59 2013
[root@atum root]#

BEARBEITEN:

Ich weiß, dass ich dort oben über etwas Kleines jammere, aber nach einer Weile habe ich es einfach satt, dass sich aus jeder Kleinigkeit (wie der Frage "Was ist das Jahr?") Ein einstündiges Googlefest oder etwas mehr oder weniger Stammesartiges entwickelt Wissen (wie die Existenz von fwtmp).

Bratchley
quelle
Ich werde diese Antwort akzeptieren, weil sie meine Frage beantwortet. Leider habe ich gerade erfahren, dass die Buchhaltungsdatei jeden Tag "gerollt" wird, so dass der lastBefehl für mich nutzlos ist. Ich habe eine andere Lösung für mein ursprüngliches Problem gefunden: Ich touch /var/lastlogin/$USERNAMEhabe meinem / etc / profile hinzugefügt , das eine Datei erstellt oder aktualisiert, wenn sich jemand anmeldet. Abgesehen davon, dass ich dieses Verzeichnis mit 777 Berechtigungen erstellen muss, entspricht dies meinen Anforderungen. Ich werde das als nächstes herausfinden.
BellevueBob
Auch nicht besonders zuverlässig, um die Login-Abrechnung von regulären Benutzern beschreibbar zu machen. Ich kann es nicht online finden, aber mehrere Stellen sagen, dass es pam_exec.soerfolgreich auf Solaris aufbaut. Wenn es eine große Sache ist, wäre das sicherer als chmod 777.
Bratchley
Ich habe vor, ein Skript zu schreiben, um diesen "touch" -Befehl mit meinem Anwendungskonto auszuführen, und es so einzustellen, dass das 777-Problem behoben wird. Ich habe es noch nie zuvor gemacht, aber ich denke, es sollte einfach sein, also arbeite ich darauf hin.
BellevueBob
Das hat mich nervt, seit ich es zum ersten Mal gelesen habe, aber Sie können entweder eine setuid-Binärdatei (und / oder sudo) ausprobieren oder wenn sich die Datei in ZFS befindet , können Sie die ACL so einstellen, dass Benutzer sie nur anhängen können . Ich werde weiter suchen / Brainstorming und wenn ich auf etwas Besseres komme, werde ich es dich wissen lassen. Haben Sie auch die BSM-Überwachung aktiviert? Dies ist möglicherweise vorzuziehen, da Sie Anmelde- / Abmeldeereignisse überwachen und dann die Überwachungsprotokolle durchsuchen können. Normale Benutzer können nicht darauf zugreifen.
Bratchley
Je mehr ich darüber nachdenke, desto mehr denke ich, dass die Verwendung von BSM zur Prüfung von loEreignissen der richtige Weg ist. Es ist eine Standardfunktion des Betriebssystems im Vergleich zu dem, was Sie tun, was für Ihren Shop spezifisch ist. Wenn Sie von einem Bus angefahren werden und dieser Sie ersetzen (oder sogar nur ergänzen) muss, sollte diese Person alles über BSM wissen und nicht manuell lernen müssen, welches System Sie zusammenstellen.
Bratchley
3

GNU / Linux lastbietet den -FSchalter an. Es würde mich allerdings wundern, wenn Solaris dies tut.

Intern sollte die wtmpDatei Epochenzeitstempel haben. Wenn Sie also etwas in C oder Perl schreiben möchten, können Sie Ihren eigenen lastBefehl erstellen . Sie müssen sich die entsprechende C-Header-Datei für die Struktur ansehen. Das wtmpist eine "binäre" Datei und kann nicht mit Standard-Parsing-Tools ausgewertet werden.

Erwägen Sie, Ihre wtmpDatei regelmäßig zu archivieren und abzuschneiden , damit Sie wissen, für welches Jahr sie gilt.

JRFerguson
quelle
Dies funktionierte perfekt für mich unter CentOS 6.7. Vielen Dank.
Aaron Wallentine
1

Ich hatte einen ähnlichen Fall, benötigte aber das Anmeldedatum in meinem benutzerdefinierten Format. Das funktioniert bei mir:

date -d "`last -F | head -n1 | sed -r 's/.*\.[0-9]+\s+//' | sed -r 's/\s(still|-).*//'`" +"%F_%R"
Mike
quelle
Ich bin mir nicht sicher, warum dies abgelehnt wurde, ich fand das sehr nützlich!
dmohr