Bashまたはawkで16進ダンプをバイト単位で読み取るには?

Bashまたはawkで16進ダンプをバイト単位で読み取るには?

これは、次のコマンドを使用してキャプチャしたIPv6 TCPパケットの16進出力ですtcpdump

 6000 0000 0018 0620 0000 0000
 0000 0000 0000 0000 0000 0001 0000 0000
 0000 0000 0000 0000 0000 0002 *0026 0026
 0000 0001 0000 0002 {5}412 0065 0034 0000*
 6162 6364    

パケット自体は*上記のsの間にあります。パケット長を32ビットワードで表します{5}(したがって5ワード長 - 20バイト)。この情報からtcpヘッダーを抽出するにはbash / awkスクリプトを使用する必要があるため、スクリプトは長さバイトを見つけて、それを使用してどれだけ読み取るべきかを知る必要があります。 Bashやawkでどうすればいいですか?

ベストアンサー1

これはPerlやPythonで行うことに近いですが、純粋なbashでも行うことができます。警告:テストされていません。

ipv6_packet='6000 … 6364'
ipv6_packet=${ipv6_packet,,?}               # normalize hexadecimal digits to lowercase, just in case
ipv6_packet=${ipv6_packet//[!0-9a-f]/}      # remove whitespace and everything else that isn't a hex digit
tcp_packet=${ipv6_packet:80}                # all but the first 40 bytes (IPv6 header)
((tcp_data_offset=0x${tcp_packet:24:1}*4))  # data offset (25th nybble), converted from words to bytes
tcp_header=${tcp_packet:0:$tcp_data_offset} # that's the TCP header (still in hexdump form)

または減らして:

ipv6_packet=${ipv6_packet,,?}; ipv6_packet=${ipv6_packet//[!0-9a-f]/}
tcp_header=${ipv6_packet:80:$((0x${ipv6_packet:104:1}*4))}

おすすめ記事