Wie protokolliere ich alle UNIX-Shell-Befehle, die von allen Benutzern gesendet wurden?

8

Gibt es eine elegante Möglichkeit, jeden in allen Shells auf einem Computer gesendeten Befehl zu protokollieren? Dies steht im Zusammenhang mit einem selten verwendeten Ubuntu-Server, von dem ich der einzige menschliche Benutzer bin. (Es gibt mehrere Benutzerkonten, die von automatisierten Systemen verwendet werden.)

Ich möchte, dass dies unauffällig und mit geringem Overhead ist, also würde ich es lieben, wenn es eine einfache Methode gäbe, die so etwas beinhaltet script.

jl6
quelle

Antworten:

9

Seit Anbeginn der Zeit (eigentlich aus der Zeit, als die Leute tatsächlich echtes Geld pro verwendetem Computerzyklus zahlen mussten) ist in Unix und seinen Klonen ein System namens Process Accounting ( acct) integriert. Dadurch konnten die Systemadministratoren genau Bescheid wissen was ihre Benutzer taten und sie so entsprechend abrechnen konnten.

Die Funktionen acctsind in den meisten Unix- und Linux-Systemen bis heute vorhanden.

Auf dieser Website: http://www.cyberciti.biz/tips/howto-log-user-activity-using-process-accounting.html erfahren Sie, wie Sie es aktivieren.

Majenko
quelle
Kann dies auch verwendet werden, um zu protokollieren, welcher Benutzer sudo und su ausführt und welche Befehle von root anschließend ausgeführt werden?
Daniel Beck
Ich glaube, es protokolliert jeden Befehlslauf, der von Benutzer, tty usw. eingegeben wird. Sie können die Befehle auf einem tty mit dem Benutzer abgleichen, der bei diesem tty angemeldet war, um zu verfolgen, welche Benutzer sie verklagt oder durchlaufen haben.
Majenko
Vielen Dank, ich war mir dieser Funktion überhaupt nicht bewusst. Ein kurzes Lesen der Manpages legt nahe, dass die Protokollierung fortgesetzt wird, bis ein Zustand mit wenig Speicherplatz erreicht ist - daher ist möglicherweise ein Protokollskript erforderlich.
16.
Ich dachte, die Prozessabrechnung hat gerade protokolliert, welches Programm ausgeführt wird, nicht der Befehl mit all seinen Argumenten.
Sirex
2

Hier ist eine sehr schöne und schnelle Möglichkeit, alle Shell-Befehle zu protokollieren :

Schritt 1:

Verwenden Sie Ihren bevorzugten Texteditor, um / etc / bashrc zu öffnen und die folgende Zeile am Ende anzuhängen:

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Schritt 2:

Stellen Sie den Syslogger so ein, dass local6 in einer Protokolldatei abgefangen wird, indem Sie diese Zeile in die Datei /etc/syslog.conf einfügen:

local6.*                /var/log/cmdlog.log

[Siehe den vollständigen Blog-Beitrag hier]

cry_wolf
quelle
Ich warne den Benutzer, dass dies deaktiviert werden kann , indem die Variable zurückgesetzt wird. Da sie "vor dem Ausgeben jeder primären Eingabeaufforderung" ausgeführt wird, wird diese Tatsache nicht protokolliert.
dmckee --- Ex-Moderator Kätzchen
2

Sie könnten snoopy verwenden .

Es ist sehr einfach zu installieren und zu entfernen (kein Kernelmodul oder Patching erforderlich). Beachten Sie, dass dies keine geeignete Prüfungslösung ist und leicht umgangen werden kann.

Offenlegung: Ich bin derzeit Snoopy Maintainer.

Bostjan Skufca
quelle
Bostjan Skufca hat auch zusätzliche Instruktionen snoopy in Ubuntu für die Installation von hier und auch in einem zusätzlichen Kommentar im selben Thread hier .
Karel
+1 für snoopy; Es bietet ein schönes Protokoll von Befehlen und Argumenten in /var/log/auth.log
David Goodwin