Intereting Posts
Как установить клиент OpenVPN на RHEL 7.3? Сценарий оболочки Bash содержит основной вопрос относительно синтаксиса и basename Как добавить строку заголовка (внутри оболочки) к выходу любой команды В Linux у меня другой цвет для того же самого, чем в Windows Коды Gnome: правильная настройка сети? Blueman-applet / bluetoothd / Thunar не принимает копию файла из obex: /…: «выполняется другая операция Мой терминал чистый белый // удаление вещей, которые spf13 сделал с моим Ubuntu Добавить статический маршрут ipv6 без подсети nmcli Добавить bash в базовое ядро ​​Linux? Как открыть приложения в оконном менеджере TWM без использования xterm Как разбить огромную строку символов на несколько строк с одинаковым количеством столбцов? Последовательная связь не работает в обоих направлениях Автозаполнение имен хостов при использовании SSH в файле истории Должен ли быть установлен X11-сервер для пересылки X11 поверх ssh? Получение SVN 1.6 / 1.7 на Fedora 20

Как читать байты hexdump by byte в bash или awk?

Это шестнадцатеричный вывод TCP-пакета IPv6, захваченного с помощью 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 выше. {5} представляет длину пакета в 32-битных словах (так что это 5 слов длиной – 20 байт). Мне нужно извлечь tcp-заголовок из этой информации, используя скрипт bash / awk, поэтому скрипту необходимо найти байт длины и использовать его, чтобы узнать, как много дальше читать. Как я могу сделать это в bash или awk?

Это больше подходит для 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))}