Wie erfasse ich eine Fehlermeldung von einem ausgeführten Befehl?


20

Ich wurde beauftragt, ein automatisiertes Server-Hardening-Skript zu erstellen, und eine Sache, die sie benötigen, ist ein Bericht über die gesamte Ausgabe jedes ausgeführten Befehls. Ich möchte die Fehlermeldung in einem String speichern und in einer Textdatei anhängen.

Angenommen, ich habe folgenden Befehl ausgeführt:

/sbin/modprobe -n -v hfsplus

Die Ausgabe dieses Befehls auf meinem Computer wäre:

FATAL: Module hfsplus not found

Wie kann ich diese Fehlermeldung in einer Zeichenfolge speichern? Jede Hilfe wäre sehr dankbar. Vielen Dank!


Ich habe versucht, den folgenden Befehl auszuführen: var = $ (/ sbin / modprobe -n -v hfsplush). Anschließend wird der folgende Befehl angezeigt: $ var Die Fehlermeldung in der Zeichenfolge wird jedoch immer noch nicht erfasst.
Miguel Roque

Antworten:


23

Sie können dies tun, indem Sie den Befehl errors umleiten:

/sbin/modprobe -n -v hfsplus 2> fileName 

als ein Skript

#!/bin/bash
errormessage=$( /sbin/modprobe -n -v hfsplus 2>&1)
echo $errormessage

oder

 #!/bin/bash
errormessage=`/sbin/modprobe -n -v hfsplus 2>&1 `
echo $errormessage

Wenn Sie den Fehler anhängen möchten, verwenden Sie >> statt>

Stellen Sie sicher, dass Sie den Fehler "Syntaxfehler in der Nähe von unerwartetem Token` & '" verwenden 2>&1und nicht 2> &1vermeiden.


Ich habe diesen Ansatz ausprobiert und speichert ihn DIREKT in der Textdatei. Ich möchte, dass es zuerst in einem String gespeichert wird, damit ich den Inhalt einfach formatieren kann.
Miguel Roque

1
@ MiguelRoque siehe Updates
Networker

1
Ich habe versucht, die Ausgabe in ein HEREDOC zu schreiben, und es hat auch funktioniert. Vielen Dank @Networker!
Miguel Roque

1
Jemand hat die von mir vorgenommene Bearbeitung zurückgesetzt, weil ich einen "Syntaxfehler in der Nähe von &" hatte und das Leerzeichen nach> entfernt habe. Eine Begründung wäre schön gewesen.
Pierre.Sassoulas

Ich habe versucht zu bearbeiten, weil: Stellen Sie sicher, dass Sie 2> & 1 und nicht 2> & 1 verwenden, um den Fehler "Syntaxfehler in der Nähe des unerwarteten Tokens" & "
peter_v

15

Einfach als String im Bash-Skript speichern:

X=`/sbin/modprobe -n -v hfsplus 2>&1`
echo $X

Dies kann ein bisschen besser sein, da Sie Meldungen sehen, wenn der Befehl ausgeführt wird:

TMP=$(mktemp)
/sbin/modprobe -n -v hfsplus 2>&1 | tee $TMP
OUTPUT=$(cat $TMP)
echo $OUTPUT
rm $TMP

1
Verwenden Sie für die Befehlsersetzung immer $ (Befehl) anstelle von Backticks. Es ist besser :)
Sree

Ich weiß, dass es besser ist (ich hatte weniger Probleme mit $ ()), aber warum ist das so?
KolonUK

4

Ich erfasse Fehler wie folgt

. ${file} 2>&1 | {
  read -d "\0" -t 0.01 error
    [ -z "$error" ] || log_warn Load completion ${file} failed: "\n${error}"
}

Wenn die Quelle fehlgeschlagen ist, werde ich den Fehler erfassen und protokollieren. log_warn ist nur eine einfache Funktion.

Übrigens benutze ich das in meinen Punktedateien


2

Zum Anhängen an eine Datei verwenden Sie /sbin/modprobe -n -v hfsplus 2>> filename


2

Neuere Bash-Versionen (dh Bash 4.1+):

$ msg=$(ls -la nofile 2>&1)
$ echo $msg
ls: cannot access nofile: No such file or directory
$ 

0

Um die Fehlermeldung in einer Variablen zurückzugeben, einfach;

error=$(/sbin/modprobe -n -v hfsplus 2>&1 1>/dev/null)

echo $error
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.