Führen Sie ein Shell-Skript für einen Befehl aus

Führen Sie ein Shell-Skript für einen Befehl aus

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 auditist 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 auditSubsystems haben Sie eine Lösung, die funktioniert, unabhängig davon, ob jemand aufruft /bin/dateoder 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 auditSubsystem (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:

  1. Erstellen Sie ein Wrapper-Skript, das das Programm protokolliert und dann ausführt (unter Verwendung der ursprünglichen Parameter).
  2. 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 serverfaultFreunde, 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.shin /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 dateeinen Befehl gibt, mein Skript ausgeführt wird und jedes Mal, wenn er den Befehl mit -sOption ausgibt, wird es angemeldet/tmp/log/user.log

verwandte Informationen