![snmpwalk 출력을 배열로 구문 분석](https://linux55.com/image/89860/snmpwalk%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EB%B0%B0%EC%97%B4%EB%A1%9C%20%EA%B5%AC%EB%AC%B8%20%EB%B6%84%EC%84%9D.png)
snmpwalk를 수행하여 네트워크 인터페이스를 가져오려고 하는데 배열에서 분리할 수 없습니다. 변수는 모두 요소 0에 저장되어 있습니다.
ifname=(\$(snmpwalk -Oqv -v2c -c comm xxx.xxx.xxx.xxx 1.3.6.1.2.1.2.2.1.2))
이것은 heredoc 안에 있습니다
어떻게 해야 하나요?
답변1
코드가 거의 작동합니다. 산출:
snmpwalk -Oqv -v2c -c public (somehost) 1.3.6.1.2.1.2.2.1.2
원하는 출력을 생성합니다. 배열에 저장하려면 내장 함수를 bash
사용 하세요. readarray
주요 주의 사항은 파이핑이 서브쉘과 환경 변수를 처리하는 방식 때문에 readarray
다음과 같이 입력을 파이핑하는 대신 표준 입력(일반적으로 명령 대체를 통해)을 구체적으로 리디렉션해야 한다는 것입니다.
readarray -t if_names < <(
snmpwalk -Oqv -v2c -c public (somehost) 1.3.6.1.2.1.2.2.1.2
)
for i in "${!if_names[@]}"
do
printf '%d: %s\n' "$i" "${if_names[$i]}"
done
0: public
1: vlan3
2: igb1
3: igb2
4: igb3
5: lo0
6: vm-public
7: tun0
답변2
당신은 사용하고 싶을 수도 있습니다snmptable
(관련된)바꾸다 snmpwalk
.
튜토리얼이 있습니다여기.
답변3
귀하의 예에서 수행하는 작업은 약간의 수정을 통해 값을 배열로 설정하는 것입니다. $ 앞에 escape \를 꺼내야 합니다
bash$ ifname=($(snmpwalk -Oqv -v2c -c $comm $device 1.3.6.1.2.1.2.2.1.2))
bash$ echo ${#ifname[@]} # how many elements in the array
58
bash$ echo ${ifname[0]} # item at index 0
"GigabitEthernet1/1/1"
bash$ echo ${ifname[1]} # item at index 1
"GigabitEthernet1/1/2"
bash$ echo ${ifname[5]} # item at index 5
"GigabitEthernet1/1/6"
snmpwalk의 반환 값에 공백이 있으면 이 방법이 작동하지 않을 수 있습니다. IFS를 사용하여 입력 필드 구분 기호를 개행 문자로 제한하는 것이 도움이 될 것입니다(이 내용을 참조하세요).스택 오버플로 답변이 문제를 해결하는 데 도움이 되었다고 생각합니다.)
OLDIFS="$IFS"
IFS=$'\n' # newlines are the only separator
IN=($(my_command ...))
IFS="$OLDIFS"