shell - awk: hping: imprimir la diferencia entre icmp originate/receive
unix (2)
Tengo la siguiente salida de hping
en OpenBSD:
# hping --icmp-ts www.openbsd.org
HPING www.openbsd.org (re0 129.128.5.194): icmp mode set, 28 headers + 0 data bytes
len=46 ip=129.128.5.194 ttl=237 id=23807 icmp_seq=0 rtt=155.3 ms
ICMP timestamp: Originate=22085077 Receive=22085171 Transmit=22085171
ICMP timestamp RTT tsrtt=156
len=46 ip=129.128.5.194 ttl=237 id=4150 icmp_seq=1 rtt=154.8 ms
ICMP timestamp: Originate=22086078 Receive=22086171 Transmit=22086171
ICMP timestamp RTT tsrtt=155
^C
--- www.openbsd.org hping statistic ---
2 packets tramitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 154.8/155.0/155.3 ms
Necesito algo de aritmética adicional para solucionar problemas de rutas asimétricas , como está disponible en un parche en algún informe de errores , pero no quiero tener que volver a compilar el software.
TL; DR, los dos nuevos campos se calculan como Receive − Originate
y Originate + tsrtt − Transmit
, para dar como resultado lo siguiente (sin necesariamente tener que abarcar 4 líneas).
len=46 ip=129.128.5.194 ttl=237 id=23807 icmp_seq=0 rtt=155.3 ms
ICMP timestamp: Originate=22085077 Receive=22085171 Transmit=22085171
ICMP timestamp RTT tsrtt=156 src->dst=94 dst->src=62
¿Cómo hago esto con awk
? (Estoy bien con cualquier otra * herramienta BSD, también).
Usando Perl, puedes hacer algo como esto:
#!/usr/bin/perl -n
#
if (/Originate=(/d+) Receive=(/d+) Transmit=(/d+)/) {
($o, $r, $t) = ($1, $2, $3);
} elsif (/tsrtt=(/d+)/) {
print $r - $o, " ", $o + $1 - $t, "/n";
}
Si llamas esto icmpstats.pl
, puedes usarlo como hping | perl icmpstats.pl
hping | perl icmpstats.pl
.
Una modificación de la solución de janos, para proporcionar un fragmento utilizable.
Tenga en cuenta que la salida de hping se amortigua completamente cuando se redirige a una tubería, lo que, sorprendentemente, inhibe bastante la portabilidad de la solución. Consulte https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe y https://unix.stackexchange.com/questions/102403/turn-off-buffering-for-hping-in -openbsd .
Lo siguiente funciona en OpenBSD, luego de instalar el paquete expect
:
unbuffer hping --icmp-ts ntp1.yycix.ca /
| perl -ne ''if (/icmp_seq=(/d+) rtt=(/d+/./d)/) {($s, $p) = ($1, $2);} /
if (/ate=(/d+) Receive=(/d+) Transmit=(/d+)/) {($o, $r, $t) = ($1, $2, $3);} /
if (/tsrtt=(/d+)/) { /
print $s, "/t", $p, "/t", $1, " = ", $r - $o, " + ", $o + $1 - $t, "/n"; }''
Se requiere lo siguiente en OS X, ya que su expect
no va acompañada de unbuffer
:
script -q /dev/null hping3 --icmp-ts ntp1.yycix.ca /
| perl -ne ''if (/icmp_seq=(/d+) rtt=(/d+/./d)/) {($s, $p) = ($1, $2);} /
if (/ate=(/d+) Receive=(/d+) Transmit=(/d+)/) {($o, $r, $t) = ($1, $2, $3);} /
if (/tsrtt=(/d+)/) { /
print $s, "/t", $p, "/t", $1, " = ", $r - $o, " + ", $o + $1 - $t, "/r/n"; }''
Este es un resultado de muestra del script, que muestra que la ruta de reenvío está congestionada, y que la ruta de retorno probablemente no sea:
0 145.5 146 = 75 + 71
1 142.7 142 = 72 + 70
2 140.7 140 = 70 + 70
3 146.7 146 = 76 + 70
4 148.3 148 = 77 + 71
5 157.5 157 = 87 + 70
6 167.1 167 = 96 + 71
7 166.3 166 = 95 + 71
8 167.7 167 = 97 + 70
9 159.0 159 = 88 + 71
10 156.7 156 = 86 + 70
11 154.9 155 = 84 + 71
12 151.9 152 = 81 + 71
13 157.3 157 = 86 + 71
14 155.0 155 = 84 + 71
15 157.7 158 = 87 + 71
16 156.6 156 = 86 + 70
17 157.8 158 = 87 + 71
18 161.9 162 = 91 + 71
19 160.1 160 = 89 + 71
20 166.3 166 = 95 + 71
21 163.9 164 = 93 + 71
22 172.0 172 = 101 + 71
23 177.9 178 = 107 + 71
24 177.0 177 = 106 + 71
25 172.1 172 = 101 + 71
26 167.4 167 = 97 + 70
27 167.1 167 = 96 + 71
28 161.0 161 = 90 + 71
29 150.5 150 = 80 + 70
30 155.6 155 = 85 + 70
31 162.0 162 = 91 + 71
32 154.3 154 = 84 + 70
Tenga en cuenta que si el reloj no está sincronizado, se estaría yendo negativo, lo que, no obstante, todavía sirve como un buen indicador de qué lado está experimentando la congestión.
El siguiente ejemplo es a través de la misma ruta; observe cómo un valor sigue subiendo y bajando aleatoriamente, mientras que el otro cambia monótonamente.
0 165.9 166 = -142113 + 142279
1 160.2 160 = -142118 + 142278
2 155.2 155 = -142122 + 142277
3 156.5 156 = -142121 + 142277
4 164.7 165 = -142112 + 142277
5 164.4 164 = -142111 + 142275
6 160.9 161 = -142114 + 142275
7 158.1 158 = -142117 + 142275
8 155.6 156 = -142119 + 142275
9 143.0 143 = -142131 + 142274
10 153.2 153 = -142120 + 142273
11 157.1 157 = -142115 + 142272
12 158.3 158 = -142114 + 142272
13 148.6 149 = -142123 + 142272
14 144.3 144 = -142127 + 142271
15 145.3 145 = -142125 + 142270
16 141.9 142 = -142128 + 142270