Welche Wege habe ich um die Befehle in history in Echtzeit in eine andere Datei zu speichern in Linux?

5 Antworten

Die History (auch im Speicher) ist standardmässig beschränkt, das nur am Rande.

# HISTFILE='myhistory.txt'
# history -w
# HISTFILE='~/.bash_history' #possibly
# history -c                 #possibly

Wenn Du jetzt vorher noch die Historygröße und die Historyfilegröße entsprechend setzt, könntest Du das also regelmässig so rausschreiben.

Eine andere Option wäre ein 'history -a' in das Command Prompt zu integrieren, sodaß die bash_history immer aktuell gehalten wird. Dann eben eine Kopie anlegen und danach truncaten.

Oft hilft es in der Anleitugn zu stöbern ...


ralphdieter  17.08.2024, 20:25
ein 'history -a' in das Command Prompt

Mann, ist das krank! Das gefällt mir :-)

KarlRanseierIII  17.08.2024, 20:50
@ralphdieter

Die Idee habe ich tatsächlich gelesen, aber ja, es zeigt wieder einmal wieviel Schindluder man mit einem bloated Befehlinterpreter so treiben kann :-D.

ralphdieter  17.08.2024, 20:52
@ralphdieter

So klappt es am besten:

export PS0='$(history -a)'

PS0 passiert erst nach der Befehlseingabe. Ich wusste gar nicht, dass es das gibt!

KarlRanseierIII  17.08.2024, 20:53
@ralphdieter

Ich sag ja 'bloated' wenn man die Hälfte aller obskuren Features kennt, ist man shcon gut dabei ;-).

KarlRanseierIII  17.08.2024, 21:00
@ralphdieter

Mir fällt gerade noch auf, ich habe nen Dreher drinne, ich meine eigentlich PROMPT_COMMAND, als ich command prompt schrieb.

Das ist auch sehr abgefahren, weil Du da im Prinzip eine ganze Sammlung von Kommandos ablegen kannst. (Und ohne Expansion arbeiten kannst)

ralphdieter  17.08.2024, 21:10
@KarlRanseierIII
ganze Sammlung von Kommandos ablegen

... und sich ein paar Wochen später ins Knie schießen, weil einer dieser Befehle in das reinpfuscht, was man gerade machen will. Ja, das kenne ich nur zu gut!

Das ist gar nicht so einfach, da in der History nur eine bestimmte Anzahl Befehle gespeichert wird. Du könntest diese Anzahl auf eine Ziffer setzen, die möglichst den ganzen Tag umfasst, dann aber leider sehr hoch ist. Danach kannst du dann entweder die History Datei kopieren oder

history > Datei

ausführen.

Alternativ wäre es möglich, die ganze Shell mit zu protokollieren

bash |& tee Datei

alles weitere lässt sich nur mit einem recht komplexen System auditoring bewerkstelligen.


Marwin388 
Beitragsersteller
 17.08.2024, 16:44

Ich will dass jeden Tag die Befehle die ich an einem Tag gemacht habe in einem .txt datei gespeichert werden und jeden Tag entweder eine neue zärtliche Datei erzeugt wird oder alles in dee selben aber wo ich unterscheiden kann welche Befehle ich wann gemacht habw und auch wenn es geht welche Urzeit usw...oder gibt es es eine einfachere Methode ?

HarryXXX  17.08.2024, 16:51
@Marwin388

Das habe ich schon verstanden. Dazu müsstest du nur im System prompt die Uhrzeit und gegebenenfalls auch noch das Datum anzeigen lassen.

Die Dateien kannst du dann per Cron Job erzeugen und mit logrotate jede Nacht umkopieren und komprimieren lassen.

HarryXXX  17.08.2024, 16:56
@Marwin388

Ach ja, falls du die ganze Shell aufzeichnest, dann kannst du natürlich am Ende alle Zeilen ohne den prompt entfernen lassen und nur die Eingaben behalten. Das sollte mit einem einfachen grep oder egrep gut funktionieren. Dann bleiben nur die Zeilen mit der Eingabe und dem Datums Stempel übrig.

Marwin388 
Beitragsersteller
 17.08.2024, 16:57
@HarryXXX

ich will halt nur die Befehle aufzeichnen und nicht das ganze shell eher

Marwin388 
Beitragsersteller
 17.08.2024, 16:59
@HarryXXX

der liebe @julihan41 hat mir einen einfacheren Weg vorgeschlagen. Aber vielen Dank . ich komme auf dich zu wenn was sein sollt. Danke für Ihre Zeit

HarryXXX  17.08.2024, 17:03
@Marwin388

Einen Zeitstempel hast du in der History Datei aber nicht.

Wenn man lange genug drüber nachdenkt, dann kommt man auf jeden Fall auf zehn verschiedene Lösungen.

Ich hab sowas vor langer Zeit mal mit acct versucht, aber dann wegen der Komplexität aufgegeben.

Marwin388 
Beitragsersteller
 17.08.2024, 17:05
@HarryXXX

ahh ja stimmt. Ich werde viele Wege ausprobieren und wenn es mir zu kompliziert ist dann mache ich halt was anderen.

ralphdieter  17.08.2024, 21:00
@HarryXXX
Einen Zeitstempel hast du in der History Datei aber nicht

Bei Bash schon – aber erst, wenn Du HISTTIMEFORMAT setzt:

export HISTTIMEFORMAT='%y-%m-%d %H:%M:%S '

Das Format wird vom Befehl history verwendet.

Falls Du bash verwendest, geht das schon automatisch und ist hochgradig konfigurierbar (suche in der bash Manpage nach „HISTCONTROL“, und – etwas versteckt – nach „histappend“). Andere Shells haben sicher vergleichbare Funktionen.

Allerdings werden die Befehle erst beim Beenden gespeichert. Deshalb Vorsicht, wenn Du die Shell unter Windows benutzt: cmd.exe schießt seine Prozesse beim Schließen brutal ab. Beende Bash also immer mit Strg-D, oder führe den Befehl history -a aus, bevor Du auf das [X] klickst.


ralphdieter  18.08.2024, 21:48

Hier eine Anleitung für Bash (als Basis für Deine perfekte Wunschlösung):

Schreibe in Deine Datei ~/.bashrc

mkdir -p ~/History
export PS0='$((echo -n \t && fc -ln -0)>>~/History/\D{{%y-%m-%d}.hist)'

und lade die Datei auf der Kommandozeile neu:

. ~/.bashrc

PS0 wird nach jeder Befehlseingabe, aber vor der Ausführung angezeigt. Speziell hier wird kein Text ausgegeben, sondern ein Befehl ausgeführt ($(...)). Der schreibt einen Zeitstempel (echo \t) und den aktuellen Befehl (fc -0) in eine Datei namens ~/History/24-08-18.hist (für heute). Das funktioniert auch bei Befehlswiederholungen (die nicht in der History landen). Und wenn die Shell tagelang offen bleibt, wird ab Mitternacht eine neue Protokolldatei angelegt. Nur Kommentarzeilen (ohne Befehl) werden dabei leider nicht gespeichert.

Das ergibt ein tägliches Sitzungsprotokoll im Ordner History. Die Bash-History bleibt dabei unangetastet: Man kann immer noch mit Strg-R Befehle von letztem Jahr wiederfinden, Duplikate und eingerückte Befehle werden nicht gespeichert, und auch alles andere, was man so konfigurieren kann, steht weiterhin voll zur Verfügung.

Man könnte es mit einem Zeitlich ausführbaren Script Versuchen.

Man Legt dies in Cron oder CronTab an . Darin Lässt man in einer Gewissen Zeit History in eine Txt Datei Kopieren. history > Datei.

Da man besser nur Anhängt anstelle es immer und immer wieder Überschreiben zu lassen wäre es besser mit history >> Datei .

Nachteil ist das sich so eine Textdatei schnell auf mehre MB Vergrößern kann.

Auch hier sollte man dann die Datei Kontrollieren und Regelmäßig sichern. Damit sie nicht zu groß wird nach der Sicherung auf dem PC die Original Datei durch eine Leere Ersetzen damit wieder sauber Aufgezeichnet werden kann.


Marwin388 
Beitragsersteller
 17.08.2024, 18:59

man kann ja die Befehle löschen die Z.B nicht von gestern kommen.

Flips100  17.08.2024, 20:47
@Marwin388

Man kann so vieles machen. Könnte auch die Datei danach in eine PDF Umkonvertieren und sie per Mail an jemanden versenden ,das geht auch.

Also die letzten x Befehle sind ja in ~/.bash_history gespeichert.

Du kannst natürlich auf diese einen Symlink machen oder einen Dienst diese Datei "beobachten" lassen und bei Bedarf den Inhalt wo anders hin kopieren lassen.

Was willst du denn genau bewerkstelligen?


Marwin388 
Beitragsersteller
 17.08.2024, 16:07

Ich will dass jeden Tag die Befehle die ich an einem Tag gemacht habe in einem .txt datei gespeichert werden und jeden Tag entweder eine neue zärtliche Datei erzeugt wird oder alles in dee selben aber wo ich unterscheiden kann welche Befehle ich wann gemacht habw und auch wenn es geht welche Urzeit usw...

julihan41  17.08.2024, 16:47
@Marwin388

Das ist ein cooles, einfaches Projekt.

Letztlich wirst du dafür die Datei ~/.bash_history täglich archivieren und durch eine leere Datei ersetzen müssen.

Der Bash-Befehl wäre (alles nach # ist ein Kommentar)

#!/bin/bash
# Datum in der Form 20240817 abspeichern
filename=$(date +%Y%m%e)
# Verschieben der bash_history in den Ordner /archiv
mv ~/.bash_history ~/archiv/$filename.txt
# Anlegen einer leeren Datei .bash_history
touch ~/.bash_history

Das kannst du als Datei archiv_bash_history.sh abspeichern und ausführbar machen:

chmod +x archiv_bash_history.sh

Anschließend erstellst du eine systemd-Service-Unit, die ein mal täglich das Skript ausführt. Siehe dafür

https://wiki.ubuntuusers.de/systemd/Service_Units/

https://wiki.ubuntuusers.de/systemd/Units/

Damit kenne ich mich jetzt aber nicht so besonders aus...

Marwin388 
Beitragsersteller
 17.08.2024, 16:48
@julihan41

oh ich dachte das wäre viel komplexer hahah ich denke ich denke manchmal zu komplex

julihan41  17.08.2024, 16:49
@Marwin388

Der Vorteil ist, dass deine Eingaben im Terminal/Bash-Befehle ja eh in .bash_history gespeichert werden. Das ist eine stinknormale Textdatei und die kann man ja einfach kopieren/verschieben/löschen/...

Ich empfehle aber zunächst, mein Skript als kopieren zu testen, also

#!/bin/bash
# Datum in der Form 20240817 abspeichern
filename=$(date +%Y%m%e).txt
# Verschieben der bash_history in den Ordner /archiv
cp ~/.bash_history ~/archiv/$filename
# Anlegen einer leeren Datei .bash_history
touch ~/.bash_history

Wenn es klappt, dann kannst du cp durch mv ersetzen.

Marwin388 
Beitragsersteller
 17.08.2024, 16:58
@julihan41

kann ich das aber nicht in "echtzeit" speichern lassen ? also sobald ich auf enter drücke ?

julihan41  17.08.2024, 17:02
@Marwin388

Ich verstehe die Frage nicht.

In Echtzeit werden deine Eingaben in der Datei .bash_history gespeichert.

Marwin388 
Beitragsersteller
 17.08.2024, 17:06
@julihan41

Omg. bin manchmal echt verpeilt. Tut mir leid. und Danke für Ihre Zeit.

julihan41  17.08.2024, 17:07
@Marwin388

Kein Problem.

Habe gerade gesehen in dem anderen Beitrag, dass du eine Uhrzeit dazu haben geloggt willst. Das ist meines Wissens nach nicht trivial machbar 😰

Marwin388 
Beitragsersteller
 17.08.2024, 17:09
@julihan41

ja das auch. Aber viele Dank. Ich werde es ausprobieren und wenn ich auf eine Lösung komme dann kann ich dir die Lösung gerne mitteilen wenn du magst.

Marwin388 
Beitragsersteller
 17.08.2024, 17:36
@julihan41

wieso machst du am Ende eigentlich noch touch ~/.bash_history ?

julihan41  17.08.2024, 19:56
@Sparrow75

Damit das Skript keine Fehler wirft, wenn zwischen verschieben und neuer Skriptausführung keine Bash-Befehle ausgeführt wurden.

Sparrow75  17.08.2024, 20:36
@julihan41

@julihan41 danke aber mir ist da eohl ein Missgeschick passiert. Als ich meine Frage stellte, habe ich, wsrum auch immer, die schon vorhandenen Kommentare nicht sehen können. Nachdem ich meine frage gepostet habe, sah ich den rest. Aber dennoch danke nochmal für deine Aufklärung 😉👍

julihan41  17.08.2024, 21:17
@Sparrow75

Kein Problem. Dafür kann man ja nachfragen.

Hätte auch gut sein können, dass ich einen Fehler gemacht habe. Ich bin bei weitem nicht "perfekt".

Marwin388 
Beitragsersteller
 17.08.2024, 22:48
@Sparrow75

Man muss halt nicht immer das ganze verschieben. Besser wäre es mit cp damit man eine Sicherheitskopie hat.

julihan41  17.08.2024, 22:51
@Marwin388

Aber dann erweitert sich deine Historie jeden Tag um die neuen Befehle. Wird dann unübersichtlich.

julihan41  18.08.2024, 08:03
@Marwin388

Naja, du kopierst die datei, ohne sie zu löschen. D.h. die Befehle sammeln sich in der Datei und diese enthält dann halt die letzten x Befehle, aber die sind nicht unbedingt am Tag y getätigt worden.

In Zahlen:

  • Angenommen .bash_history speichert 30 Befehle.
  • An Tag 20240817 sind 30 Befehle darin.
  • Es wird kopiert und in der 20240817.txt sind 30 befehle.
  • Du hast an dem Tag aber nur 10 Befehle getätigt.
  • D.h. 20 Befehle sind vom Tag 20240816 oder sogar noch älter.