Wireshark: Удаленный захват через UART

Этот awk скрипт покажет вам разницу в секундах между отметками времени во втором столбце первых двух строк

awk -F, '{ cmd = "date --date " $2 " +%s "; cmd | getline sec[NR] } NR>2 { exit } END { print (sec[2] > sec[1]) ? (sec[2] - sec[1]) : (sec[1] - sec[2]) }' <filename

Он может тоже можно разбить так, если хотите:

awk -F, '
    # Read a line, get column two and convert it to seconds since the epoch
    { cmd = "date --date " $2 " +%s "; cmd | getline sec[NR] }

    # After two lines start to exit
    NR>2 { exit }

    # At exit print the absolute value of the difference between the two times
    END { print (sec[2] > sec[1]) ? (sec[2] - sec[1]) : (sec[1] - sec[2]) }

' <filename
3
18.04.2017, 12:34
1 ответ

Наконец, я получил действительно работающую систему. Это не идеальная настройка, но, по крайней мере, она работает, так что, возможно, это поможет кому-то в будущем.

Я использовал сценарий Python поверх PySerial для запуска tcpdump через UART и использования hexdump, чтобы двоичные данные могли пройти по каналу связи, не будучи измененными правилами транскрипции tty. Затем сценарий Python преобразует данные обратно и передает их в wireshark. Приведенный ниже сценарий является результатом, по сравнению со сценарием из вопроса, я добавил опцию -v в hexdump, чтобы он не пытался сжимать одинаковые строки.

import serial
import sys
import subprocess
import binascii

def main(args):
    with serial.Serial('/dev/ttyUSB0', 115200, timeout=5) as ser:
        # Spawn tcpdump on the host and convert the raw output to stupid hex format
        # We need hexdump -C because that's the only format that doesn't mess up with the endianess
        length = ser.write(b"tcpdump -U -s256 -i eth0 -w - 2> /dev/null | hexdump -Cv\n")
        # Discard command line that is echoed
        discard = ser.readline()
        # Spawn wireshark
        wireshark = subprocess.Popen(
            ["wireshark", "-k", "-i", "-"], stdin=subprocess.PIPE
        )
        while True:
            # Process each line separately
            data = ser.readline().decode('ascii')
            elements = data.split()
            # Remove the address and ascii convertion of hexdump and spaces
            hexa = "".join(elements[1:17])
            # Convert back hex to binary
            real_data = binascii.unhexlify(hexa)
            # Feed to the shark
            wireshark.stdin.write(real_data)
            try:
                wireshark.stdin.flush()
            except BrokenPipeError as e:
                break
        # Stop tcpdump
        ser.write(b"\x03")
        wireshark.wait()
    return 0

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))
2
27.01.2020, 21:25

Теги

Похожие вопросы