Wenn Sie den Befehl snmpstatus verwenden, leiten Sie alle Terminalausgaben einschließlich „Timeout: ...“ an eine Variable um

Wenn Sie den Befehl snmpstatus verwenden, leiten Sie alle Terminalausgaben einschließlich „Timeout: ...“ an eine Variable um

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 smnpwalkzum 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>&1muss daher geschrieben werden, aber beim Lesen konnte ich nicht feststellen, warum.

Dieser StackoverflowAntwortwar sehr hilfreich, ebenso wiediese sehr gut geschriebene Seite zur Umleitung.

verwandte Informationen