GNU/Linux >> Tutoriales Linux >  >> Linux

tcpdump:¿cómo obtener una salida grepable?

Para aquellos como tú que no pueden usar ngrep , aquí se explica cómo usar awk para hacer el tcpdump salida del contenido del paquete grepable.

Primero, algunos resultados de muestra proporcionados por tcpdump -x , para presentar la tarea por delante:

$ tcpdump -xr dump.pcap 2>/dev/null
12:04:59.590664 IP 10.17.14.93.51009 > 239.194.1.9.51009: UDP, length 370
        0x0000:  4500 018e 0000 4000 fa11 7625 0a11 0e5d
        0x0010:  efc2 0109 c741 c741 017a 6f28 1120 2020
        0x0020:  3337 3030 3039 3031 3835 3635 3430 3130
...

Y este es el copiar y pegar awk secuencia de comandos a la que puede canalizar la salida

awk '{ if (match($0, /^[0-9]/, _)) { printf (NR == 1 ? "%s " : "\n%s "), $0; fflush() } else { sub(/^\s+0x[0-9a-z]+:\s+/, " "); gsub(" ", ""); printf "%s", $0 } } END { print ""; fflush() }'

para obtener el siguiente resultado grepable

12:04:59.590664 IP 10.17.14.93.51009 > 239.194.1.9.51009: UDP, length 370 4500018e00004000fa1176250a...
12:04:59.590798 IP 10.17.14.113.51011 > 239.194.1.11.51011: UDP, length 370 4500018e00004000fa11760f...
...

A continuación se muestra una versión comentada del script anterior:

awk '{
    # if this is a header line
    if (match($0, /^[0-9]/, _)) {
        # print the header, but:

        # except for the first line,
        # we need to insert a newline,
        # as the preceding data lines
        # have been stripped of theirs

        # we also append a space to
        # separate header info from the
        # data that will get appended
        printf (NR == 1 ? "%s " : "\n%s "), $0
        # enforce line-buffering
        fflush()
    }
    # otherwise it is a data line
    else {
        # remove the data address
        sub(/^\s+0x[0-9a-z]+:\s+/, " ");
        # remove all spaces
        gsub(" ", "");
        # print w/o newline
        printf "%s", $0 
    }
}
END {
    # print final newline, as
    # the preceding data lines
    # have been stripped of theirs
    print ""
    # enforce line-buffering
    fflush()
}'

De los tcpdump página de manual:

-A      Print each packet (minus its link level header) in ASCII.  Handy
        for capturing web pages.

Asegúrate de usar también el -s 0 opción para asegurarse de que se muestra todo el paquete.


Linux
  1. ¿Cómo obtener un tipo de datos de variables en Zsh?

  2. ¿Cómo hacer que Uuencode funcione?

  3. ¿Cómo recordar cómo usar la redirección?

  4. ¿Cómo crear una salida virtual en Pulseaudio?

  5. ¿Cómo obtener resultados de gdb.execute en PythonGDB (GDB 7.1)?

Cómo obtener su dirección IP en Linux

¿Cómo hacer que sha1sum genere binario?

Cómo ordenar esta salida 1,10,11..2

¿Cómo puedo ordenar la salida du -h por tamaño?

Cómo grep salida ps con encabezados

¿Cómo detener la salida de ping?