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!

Miguel Roque
quelle
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.

Networker
quelle
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
Graphit
quelle
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

wener
quelle
2

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

harish.venkat
quelle
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
$ 
BurningKrome
quelle
0

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

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

echo $error
Jonathan
quelle