snmpwalk出力を配列に解析する

snmpwalk出力を配列に解析する

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"

関連情報