Falle beim DEBUG-Signal für die Dash-Shell?

Falle beim DEBUG-Signal für die Dash-Shell?

Mit der Bash-Shell können Sie einen Trap auf dem synthetischen DEBUGSignal installieren. Dies ist nützlich und führt Ihre Funktion oder Ihren Code bei jedem Shell-Befehl aus. Beispiel:

$ trap 'logger -t shell "${BASH_COMMAND}"' DEBUG

Die Idee dabei ist, den Trap beispielsweise in einer Datei zu installieren /etc/profile.d/bash-loggerund alle Shell-Sitzungsbefehle des Benutzers automatisch ins Syslog zu protokollieren, wenn sie auftreten. Dies ist auch nützlich, umEinfaches Verfolgen von Remote-Befehlen.

Wenn ich mir den Quellcode der Dash-Shell anschaue, wird mir klar, dass kein solches DEBUGSignal verfügbar ist.

Gibt es Workarounds oder Alternativen, um mit der Dash-Shell dasselbe Ergebnis zu erzielen?

Antwort1

Der gründlichste Ansatz wäre, die Shell mit aktivierter Syslog-Unterstützung neu zu kompilieren. Damit können Sie auch Shells umgehen, die (aus welchem ​​Grund auch immer) ~/ nicht laden.was auch immer-profile oder ~/.was auch immer-rc.

Dies ist als Option in der Standardquelle für Bash enthalten, für andere Shells müssen Sie jedoch möglicherweise einen Patch finden oder schreiben.

Ich würde nicht empfehlen, evalZeile für Zeile zu lesen und zu int., da Befehle mehrere Zeilen umfassen können und evalein halber Befehl entweder fehlschlägt oder das Falsche bewirkt. Zu den betroffenen Befehlstypen gehören: Pipelines und bedingte Befehle (wobei jede Zeile mit &&, ||oder endet |), zusammengesetzte Befehle (einschließlich eingeklammerter Gruppen), Zeilen, die mit Backslashs fortgesetzt werden, mehrzeilige Zeichenfolgen in Anführungszeichen und <<Here-Docs. (Es gibt wahrscheinlich noch mehr, an die ich nicht gedacht habe.)

In bestimmten Fällen kann es sinnvoll sein set -v, es mit der Umleitung von stderr in eine Pipe zum Logger zu kombinieren. Dies ist jedoch nicht perfekt, da es auch stderr von den von Ihnen ausgeführten Programmen umleitet. (In Bash können Sie einen anderen Dateideskriptor zum Schreiben set -xauswählen , wodurch dieses Problem gelöst wird.)set -x

Ich möchte darauf hinweisen, dass in diesem Fall ssh host some_command keine interaktive Shell oder Login-Shell beteiligt ist, sodass Ihre RC-Dateien nicht geladen werden und Ihre Protokollierung umgangen würde.

verwandte Informationen