GNU/Linux >> Linux Esercitazione >  >> Linux

tcpdump:come ottenere un output grepable?

Per quelli come te che non possono usare ngrep , ecco come utilizzare awk per fare il tcpdump output del contenuto del pacchetto grepable.

Prima alcuni esempi di output forniti da tcpdump -x , al fine di presentare il compito da svolgere:

$ 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
...

E questo è il copia e incolla awk script a cui puoi reindirizzare l'output

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() }'

per ottenere il seguente output 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...
...

Di seguito è riportata una versione commentata dello script precedente:

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()
}'

Dal tcpdump manpage:

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

Assicurati di utilizzare anche il -s 0 opzione per assicurarsi che venga visualizzato l'intero pacchetto.


Linux
  1. Come ottenere la dimensione della directory in Linux

  2. Come ottenere l'output da gdb.execute in PythonGDB (GDB 7.1)?

  3. Come ottenere l'utilizzo della CPU

  4. Come ottenere un elenco di directory in una zip?

  5. come ottenere sha1sum per l'output binario?

Come ottenere il tuo indirizzo IP su Linux

Come creare un output virtuale in Pulseaudio?

Come ottenere l'ID processo del processo in background?

Come ottenere ps per stampare il gruppo?

Come ottenere solo tutti gli ID di processo in esecuzione?

Come ordinare questo output 1,10,11..2