Ich verwende Bash 5.0.007-1 und Net-SNMP 5.8-2 auf einem aktuellen Arch Linux.
Diese Zeile erfasst den Status eines Geräts:
snmpstatus -c public -v1 192.168.1.240
Wenn das Gerät nicht eingeschaltet ist, d. h. die obige IP-Adresse im Netzwerk nicht existiert, gibt der obige Befehl die folgende Ausgabe an das Terminal zurück:
Timeout: No Response from 192.168.1.240
Wie kann ich verhindern, dass diese Timeout-Ausgabezeile im Terminal angezeigt wird, und sie stattdessen in einer Variablen erfassen? Auch wenn das Gerät eingeschaltet ist und die IP-Adresse existiert, sollte die normale Ausgabe auf dem Terminal angezeigt und an dieselbe Variable übergeben werden.
Ich werde die Variable analysieren, sobald ich sie habe, und je nach Inhalt entscheiden, was zu tun ist.
(Ich habe ziemlich viel gelesen man snmpcmd
, unter anderem man smnpwalk
zum Thema und zur Umleitung, aber die Lösung kommt mir nicht in den Sinn.)
Antwort1
Ich habe es herausgefunden. Im Großen und Ganzen war das Problem, das ich hatte, darauf zurückzuführen, dass ich die Umleitung vorgenommen hatte, nachdem ich die Ausgabe des Befehls weitergeleitet hatte
snmpstatus -c public -v1 192.168.1.240
zu grep und dann zu sed, am Ende eines ziemlich langen Einzeilers. Mir war damals nicht klar, dass die Umleitung von stderr oder stdout unmittelbar nach dem zugehörigen Befehl erfolgen muss, obwohl es jetzt sehr offensichtlich ist. Das ist wichtig, weil ich die Lösung eigentlich gefunden und sie als seltsamerweise nicht funktionierend verworfen hatte, weil ich versucht hatte, am Ende der Pipe umzuleiten.
So leiten Sie den stderr auf eine Variable um
error=$(snmpstatus -c public -v1 192.168.1.240 2>&1)
echo $error
Hier ist eine Erklärung der Syntax
0 = stdin
1 = stdout
2 = stderr
> = redirect
Daher bedeutet 2>1, stderr auf stdout umzuleiten. Das & ist wichtig und 2>&1
muss daher geschrieben werden, aber beim Lesen konnte ich nicht feststellen, warum.
Dieser StackoverflowAntwortwar sehr hilfreich, ebenso wiediese sehr gut geschriebene Seite zur Umleitung.