snmpstatus 명령을 사용할 때 'Timeout: ...'을 포함한 모든 터미널 출력을 변수로 리디렉션합니다.

snmpstatus 명령을 사용할 때 'Timeout: ...'을 포함한 모든 터미널 출력을 변수로 리디렉션합니다.

저는 최신 아치 리눅스에서 bash 5.0.007-1과 net-snmp 5.8-2를 실행하고 있습니다.

이 줄은 장치의 상태를 수집합니다.

snmpstatus -c public -v1 192.168.1.240

장치의 전원이 켜지지 않은 경우, 즉 위의 IP 주소가 네트워크에 존재하지 않는 경우 위 명령은 아래 출력을 터미널에 반환합니다.

Timeout: No Response from 192.168.1.240

터미널에 표시되는 이 시간 초과 출력 줄을 중지하고 대신 변수에 캡처하려면 어떻게 해야 합니까? 또한 장치가 켜져 있고 IP 주소가 존재하는 경우 일반 출력이 터미널에 표시되고 동일한 변수에 출력이 전달되어야 합니다.

변수가 있으면 구문 분석하고 해당 내용에 따라 무엇을 할지 결정하겠습니다.

( 리디렉션에 대해 man snmpcmd, 및 를 포함하여 꽤 많은 내용을 읽었 지만 해결책이 나를 피하고 있습니다.)man smnpwalk

답변1

나는 그것을 알아. 내가 겪은 큰 문제는 명령의 출력을 파이프한 후 리디렉션을 수행했기 때문입니다.

snmpstatus -c public -v1 192.168.1.240

꽤 긴 라이너 끝에 grep을 누른 다음 sed를 수행합니다. 지금은 매우 분명하지만 당시에는 stderr 또는 stdout의 리디렉션이 관련 명령 직후에 발생해야 한다는 사실을 깨닫지 못했습니다. 실제로 해결책을 찾았고 파이프 끝에서 리디렉션을 시도했기 때문에 이상하게 작동하지 않는 것으로 폐기했기 때문에 이것은 중요합니다.

stderr을 변수로 리디렉션하는 방법은 다음과 같습니다.

error=$(snmpstatus -c public -v1 192.168.1.240 2>&1)
echo $error

다음은 구문에 대한 설명입니다. 0 = stdin 1 = stdout 2 = stderr > = redirect

따라서 2>1은 stderr를 stdout으로 리디렉션하는 것을 의미합니다. 따라서 &는 필수이므로 2>&1작성해야 하지만, 읽어보니 그 이유를 알 수 없었습니다.

이 스택오버플로우답변매우 도움이 되었고, 그랬습니다.리디렉션에 대해 매우 잘 작성된 페이지입니다..

관련 정보