. Die Anforderung besteht darin, den Befehlszeilenverlauf in einer Datei mit einem bestimmten Datum und einer bestimmten Uhrzeit der Befehle zu erfassen, wenn diese ausgeführt wurden.
Das folgende Skript erfasst den Verlauf mit Datum und Uhrzeit, weist aber auch das aktuelle Datum und die aktuelle Uhrzeit für ältere Befehle zu. Außerdem möchte ich das Skript erweitern, um eine inkrementelle Sicherung der Verlaufsausgabedatei zu erstellen.
#!/bin/bash . ~/.bash_profile HISTFILE=~/.bash_history set -o history history >/home/user/hist_`date "+%d%b%y%T"`
Kommentare
- Verwenden Sie hierfür nicht ‚ den Shell-Verlauf. Verwenden Sie Buchhaltung oder sudo (und protokollieren Sie sudo-Befehle).
- Verwenden von Buchhaltung oder sudo für die Verlaufserfassung in einer Datei
- sudo kann so konfiguriert werden, dass der Verlauf (und sogar die tty-Ausgabe) erfasst werden ) in eine Datei (oder über Syslog). Was meinen Sie mit “ Buchhaltung „?
- @SunLynx, siehe Wie können Sie jeden eingegebenen Befehl protokollieren?
Antwort
Nicht ganz das, was Sie tun gesucht, aber Sie können bash
erhalten, um jeder Zeile im Verlauf automatisch Zeitstempel hinzuzufügen. Stellen Sie für Ihr Beispiel einfach Folgendes ein:
HISTTIMEFORMAT="%d%b%y%T "
Der Befehl history
ohne Argumente zeigt dann Ihre Verlaufseinträge wie folgt an:
23Jul1515:48:14 ls -ld .
Die history -w
schreibt jedoch immer die Verlaufsdatei im internen Format von:
#1437659315 ls -ld .
dh In 2 Zeilen enthält die erste Zeile die Zeit in Sekunden „seit der Epoche“ (dh 1. Januar 1970) mit einem #
vor, damit sie nicht mit einem Befehl verwechselt wird.
Kommentare
- Ich möchte den Verlauf täglich erfassen. Das obige Skript funktioniert, weist jedoch allen Befehlen das aktuelle Datum zu. Auch nach jedem Befehl wird eine Nummer generiert, die ich ‚ nicht möchte. Wenn jemand helfen kann, ist das sehr hilfreich.
- Ich weiß nicht, was Sie mit “ meinen. Eine Zahl generiert „. Könnten Sie Ihre ursprüngliche Frage mit einem Beispiel für die gewünschten Dateien und deren Inhalt bearbeiten?
- 598 05Jul15 00: 00: 01less .bash_history 599 05Jul15 00: 00: 01 # 1435987168 600 05Jul15 00: 00: 01man rsync 601 05Jul15 00: 00: 01 # 1435988263 602 05Jul15 00: 00: 01ls -lrt / srv / cloud- * 603 05Jul15 00: 00: 01 # 1435988281 604 05Jul15 00: 00: 01crontab -l 605 05Jul15 00: 00: 01 # 1435988290 606 05Jul15 00: 00: 01cat /srv/cloud-user_hist.sh
- wie diese Nachrichten erzeugen
- ist es schwierig, dies in einem Kommentar zu lesen. Entfernen Sie Ihre Kommentare und bearbeiten Sie die Frage , die Sie ursprünglich geschrieben haben.
Antwort
In bash gibt es eine Option, die bash anweist, mit jedem Befehl einen Zeitstempel aufzuzeichnen. Dazu weisen Sie der Umgebungsvariablen HISTTIMEFORMAT
einen nützlichen Wert zu. Aus der Manpage bash
:
Wenn diese Variable gesetzt und nicht null ist, wird ihr Wert als a verwendet Formatieren Sie die Zeichenfolge für
strftime(3)
, um den Zeitstempel zu drucken, der jedem Verlaufseintrag zugeordnet ist, der vom integrierten Verlauf angezeigt wird. Wenn diese Variable festgelegt ist, werden Zeitstempel in die Verlaufsdatei geschrieben, damit sie über Shell-Sitzungen hinweg beibehalten werden können. Hierbei wird das Verlaufskommentarzeichen verwendet, um Zeitstempel von anderen Verlaufszeilen zu unterscheiden.
In meiner Umgebung verwende ich
Damit die Befehle leicht sortiert werden können (%s
ist Zeitstempel in Sekunden) und für Menschen lesbar. Wenn ich in meiner Shell history
eingebe, sehe ich ungefähr Folgendes:
3 1437664568 (17:16:08):man bash 4 1437664699 (17:18:19):history
EDIT: OP-Frage nicht vollständig beantwortet.
Außerdem möchte ich das Skript erweitern, um eine inkrementelle Sicherung der Verlaufsausgabedatei zu erstellen.
Ich bin mir nicht sicher, was Sie unter „inkrementeller Sicherung“ der Verlaufsdatei verstehen. Vielleicht möchten Sie den Verlauf einfach regelmäßig sichern. Es gibt verschiedene Möglichkeiten:
- Setzen Sie die Variable PROMPT_COMMAND mit
history -a
, um den Verlaufsbefehl nach jedem Aufruf kontinuierlich zu aktualisieren (anstatt auf das Abmelden zu warten). - Trap the DEBUG Signal mit einer von Ihnen definierten Funktion. Jedes Mal, wenn ein Befehl eingegeben wird, wird die Funktion aufgerufen. Innerhalb der Funktion können Sie alles tun. (Etwas zuverlässiger als PROMPT_COMMAND.)
- Cronjob zum regelmäßigen Kopieren / Archivieren die Verlaufsdatei.
Kommentare
- Vielen Dank für Vorschläge, aber ich ‚ habe oben getestet. Können Sie bitte mehr über die Geschichte erzählen? Shell-Skript funktioniert gut, aber falsche Zeitstempel.Dies ist das eine Problem und ein anderes ist eine Zahl nach jedem Befehl, der mit # beginnt. für z.B. # 1435987168.
- Die
#1435987168
in der Verlaufsdatei ist der Zeitstempel ! Es gibt verschiedene Möglichkeiten, dies in ein benutzerfreundliches Format zu konvertieren: Laden Sie die Verlaufsdatei mithistory -n _filename_
und dannhistory
in bash . Oder Sie können Folgendes tun:perl -lane '{ /^#(\d+)$/&&print "#".localtime($1) or print;}' $HISTFILE
, um den Verlauf mit den Zeitstempeln anzuzeigen. ‚ ist es wahrscheinlich, dass die Zeitstempel korrekt sind, aber Sie haben ein Problem mit dem Gebietsschema oder der Zeitzone? - Erarbeiten Sie
history -a
?? Die Manpage ist etwas irreführend. Der aktuelle Sitzungsverlauf wird an die mit $ HISTFILE angegebene Datei angehängt. Bei nachfolgenden Aufrufen wird der seit dem letzten Aufruf generierte Verlauf angehängt (‚ überschreibt nicht die gesamte Datei immer wieder)