Alle eingegebenen Befehle auf einem Linux Server ins Log schreiben

Mir reicht die history, die man unter Linux bekommt nicht so ganz aus. Zum Einen fehlt mir eine Datum und Uhrzeitangabe und zum Anderen verschwinden manchmal ganze Sessions.

Warum die Sessions verschwinden habe ich herausgefunden. Die ganzen Befehle, die in einer Session eingegeben werden, werden erst beim ordnungsgemäßen verlassen derselben in die history geschrieben. So kann leicht etwas verschwinden.

Zeitstempel lassen sich zur history hinzufügen, aber mir reicht das noch immer nicht. Ich hätte am liebsten eine Logdatei, in der alle aufgerufenen Kommandos sofort eingetragen werden.

Also Google fragen und siehe da eine Lösung ist in greifbarer Nähe…

Dazu müssen 2 Schritte durchgeführt werden:

  • Syslog einstellen, dass bestimmte Nachrichten in der gewünschten Logdatei landen
  • Die Shell so einrichten, dass bei jedem aufgerufenen Befehl eine Nachricht an syslogd geschickt wird

Zunächst muss eine Erweiterung an der /etc/syslog.conf vorgenommen werden und zwar wird folgende Zeile ans Ende angehängt:

local7.*                /var/log/cmdhist

Danach muss syslogd neugestartet werden (/etc/init.d/sysklogd restart). Damit werden alle Nachrichten, die mit dem Befehl logger an “local7″ gesendet werden in das neue Logfile geschrieben.

Der 2. Schritt gestaltet sich ein wenig trickreicher. Nach der Eingabe eines Befehls auf der Kommandozeile soll dieser als Nachricht per logger geschickt werden.

Dazu kann die bash-Variable “PROMPT_COMMAND” verwendet werden. Eventuell ist bereits etwas in dieser Variablen eingetragen. Dies kann mit “;” getrennt hinten angehängt werden. Was in dieser Variablen eingetragen ist, wird nach jedem Befehl ausgeführt (eigentlich um einen Prompt zu generieren).


PROMPT_COMMAND='logger -i -p local7.notice -t "${USER}<${FROMIP}>:${PWD}" -- `history 1`; echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'

Der echo Befehl nach dem Semikolon war schon vorhanden. Die Variable kann in der .bashrc gesetzt werden. Am sinnvollsten schreibt man das in alle .bashrc und auch in die systemweite (/etc/bash.bashrc) und in die Vorlage (). Man erhält alle Vorkommen der bashrc mit dem Befehl

find / -name "*shrc*".

Der Befehl
logger -i -p local7.notice -t "${USER}<${FROMIP}>:${PWD}" -- `history 1`
besagt, dass an “local7.notice” mit dem sog. Tag username<ip>:pfad der zuletzt eingegebene Befehl (history 1) geschickt werden soll. Die Variablen USER und PWD werden automatisch gesetzt. Die IP von der sich der aktuelle Benutzer gerade eingeloggt hat muss jedoch noch ermittelt werden. Dazu kann “last” verwendet werden:

export FROMIP=`last -i | head -1 | awk ‘{print $3}’`

Auch dieser Befehl muss in die bashrc. Danach ist der 2. Schritt erledigt.

Nach ein paar Eingaben kann man bereits unter /var/log/cmdhist die Befehle sehen.

Einen Kommentar schreiben