Ich mache ein einfaches expect-Skript, das die Ausgabe von tcpdump für eine Liste von Multicast-Adressen überwacht. Ich möchte wissen, ob Pakete von jeder Multicast-Adresse in der Liste empfangen werden oder nicht, bevor das Zeitlimit überschritten wird.So suchen Sie nach mehreren Mustern, die in einer Liste gespeichert sind, bis alle Elemente gefunden wurden oder eine bestimmte Zeit verstrichen ist
Ich habe eine funktionierende Lösung, aber es ist ineffizient, und ich glaube, dass ich nicht die volle Kraft von expect und tcl nutzen. Wie auch immer, hier ist meine aktuelle Skript:
set multicast_list {225.0.0.1 225.0.0.2 225.0.0.3}
send "tcpdump -i ixp1\r"
# If tcpdump does not start, unzip it and run it again
expect {
"tcpdump: listening on ixp1" {}
"sh: tcpdump: not found" {
send "gunzip /usr/sbin/tcpdump.gz\r"
expect "# "
send "tcpdump -i ixp1\r"
exp_continue
}
}
# Set timeout to the number of seconds expect will check for ip addresses
set timeout 30
set found [list]
set not_found [list]
foreach ip $multicast_list {
expect {
"> $ip" { lappend found "$ip" }
timeout { lappend not_found "$ip" }
}
}
set timeout 5
# Send ^c to stop tcpdump
send -- "\003"
expect "# "
So wie Sie das Skript für jede IP-Adresse aussehen wird einen nach dem anderen, und wenn die ip es es auf die Liste der gefundenen Adressen hinzufügen ist zu sehen, zu sehen. Wenn die Zeit abgelaufen ist, wird die Adresse zur nicht gefundenen Liste hinzugefügt und nach der nächsten Adresse gesucht.
Nun zurück zu meiner Frage: Gibt es eine Möglichkeit, tcpdump für alle IP-Adressen gleichzeitig über einen bestimmten Zeitraum zu überwachen. Wenn die Adresse gefunden werden soll, möchte ich sie zu der Liste der gefundenen Adressen hinzufügen und im Idealfall aufhören, sie zu erwarten (dies ist möglicherweise nicht möglich, da bin ich mir nicht sicher). Der Schlüssel ist, ich brauche das Skript, um für alle IPs in der Liste parallel zu überwachen. Ich kann nicht jede Adresse hart codieren, weil sie jedes Mal unterschiedlich sind und die Menge der Adressen, die ich suche, wird auch variieren. Ich könnte wirklich etwas Hilfe von einem erwarteten Guru lol gebrauchen.
Vielen Dank!
Vielen Dank Donnal! Das hat mich definitiv auf den richtigen Weg gebracht, aber ich habe immer noch Probleme. Mein Hauptproblem ist jetzt, dass tcpdump ständig Multicast-Pakete von den Adressen in multicast_list empfängt. Wenn also einmal ein Paket von 225.0.0.1 erwartet wird, wird es zur gefundenen Liste hinzugefügt, was großartig ist. Aber dann wird es ein weiteres Paket von der gleichen Adresse empfangen und erwartet wird erneut ausgelöst, anstatt es zu ignorieren. Dies bewirkt, dass der Erwartungswert niemals überschritten wird. Auch mit Ihrem Code bekomme ich einen Fehler, da versucht wird, die Adresse aus der Warteliste zu entfernen, obwohl sie bereits entfernt wurde ... –