
Ich möchte ein Shell-Skript ausführen, wenn date -s <string>
der Befehl verwendet wird. Beispielsweise möchte ich den Befehl in die Datei /tmp/user.log protokollieren, indem ich den folgenden Befehl im Shell-Skript ausführe
logger -p user.notice "date -s command executed" -f /tmp/user.log
Wie kann ein Shell-Skript ausgeführt werden, wenn date -s <string>
es auf der Shell ausgeführt wird?
Um es allgemeiner zu machen: Ich möchte mein Shell-Skript ausführen, wenn jemand anderes einen bestimmten Linux-Befehl auf meinem System ausgibt. Wie mache ich das?
Antwort1
Um die Frage anders zu formulieren: Sie möchten wissen, wann jemand versucht, die Systemzeit einzustellen. Genau dafür audit
ist das Subsystem da ... es ermöglicht Ihnen, die Ausführung bestimmter Systemaufrufe zu überwachen. In diesem Fall möchten Sie wissen, wann immer jemand einen der verschiedenen Systemaufrufe aufruft, die die Systemzeit ändern können. Durch die Verwendung des audit
Subsystems haben Sie eine Lösung, die funktioniert, unabhängig davon, ob jemand aufruft /bin/date
oder seine eigene, lokal erstellte Version des Befehls verwendet.
Eine vollständige Beschreibung der Regelsyntax und Beispiele für die Prüfung von Zeitänderungsvorgängen finden Sie unter und . Suchen Sie in der Beispieldatei nach „time-change“ . auditd(8)
Sie finden diese Datei möglicherweise auf Ihrem lokalen System oder hier:audit.rules(7)
nispom.rules
Weitere Informationen zum audit
Subsystem (Dokumentation ist etwas schwierig zu bekommen):
Antwort2
Sie können einen Benutzer nicht einfach daran hindern, seine eigene Version eines Programms auszuführen. Wenn Sie jedoch davon ausgehen, dass der Benutzer keine böswillige Absicht verfolgt, ist es einfach:
- Erstellen Sie ein Wrapper-Skript, das das Programm protokolliert und dann ausführt (unter Verwendung der ursprünglichen Parameter).
- Stellen Sie sicher, dass der Wrapper das Originalprogramm im Benutzerpfad ersetzt.
Sie können entweder einen Alias verwenden, damit die Benutzer den Wrapper verwenden, oder Sie können das Originalprogramm einfach verschieben/umbenennen und den Wrapper am ursprünglichen Speicherort platzieren.
Wenn Sie nur einige der Ausführungen protokollieren möchten, verwenden Sie einen regulären Ausdruck im Wrapper-Skript.
Antwort3
Vielen Dank, meine serverfault
Freunde, für die Antworten.
Ich glaube, ich habe mit Ihrer Hilfe eine Antwort auf meine Frage gefunden. Aber können Sie mir bitte alle weiterhelfen, wenn damit ein Fehler verbunden ist oder Verbesserungen vorgenommen werden müssen? Hier bin ich.
Das sind die Dinge, die ich getan habe.
i). erstellte ein Skript datewrapper.sh
in /etc mit dem folgenden Code
#! /bin/bash # wrapper script for the date command. # whenever the date -s command is issued, it will be logged. # executing the date command first with parameter list if any date $@ # check whether the date command executed successfully if [ "$?" == "0" ] ; then for param in $@ ; do # if "-s" option is used, log it if [ "$param" == "-s" ] ; then # user.notice logs the message to /tmp/log/user.log # as per the commands in /etc/syslog-ng/syslog-ng.conf logger -p user.notice "New date set" break fi done fi exit 0
ii). chmod a+x /etc/datewrapper.sh ; alias date='/etc/datewrapper.sh'
iii) Datum
Dienstag, 21. Dezember 2010, 21:51:01 UTC
iv). Datum -s "21:53:05"
Dienstag, 21. Dezember 2010, 21:53:05 UTC
v). Ich habe /tmp/log/user.log überprüft. Es zeigt die Meldung
21. Dez 21:53:05 localhost root: Neues Datum festgelegt
Das Ergebnis ist, dass jedes Mal, wenn der Benutzer date
einen Befehl gibt, mein Skript ausgeführt wird und jedes Mal, wenn er den Befehl mit -s
Option ausgibt, wird es angemeldet/tmp/log/user.log