【问题标题】:awk: hping: print difference between icmp originate/receiveawk: hping: 打印 icmp 发起/接收之间的差异
【发布时间】:2013-12-08 22:29:11
【问题描述】:

我在 OpenBSD 上从 hping 得到以下输出:

# 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

我需要一些额外的算法to troubleshoot asymmetric routes,如a patch in some bugreport 中提供的那样,但我不想重新编译软件。

TL;DR,这两个新字段计算为 Receive − OriginateOriginate + tsrtt − Transmit,结果如下所示(不必跨越 4 行)。

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

如何使用awk 执行此操作? (我也可以使用任何其他 *BSD 工具。)

【问题讨论】:

    标签: shell unix awk ping


    【解决方案1】:

    使用 perl,您可以执行以下操作:

    #!/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";
    }
    

    如果你调用这个icmpstats.pl,你可以使用hping | perl icmpstats.pl

    【讨论】:

    • hm,我认为这与某种缓冲问题有关——如果我将输出从 hping 保存到中间文件,然后将 cat 和管道传输到 perl -ne 'if ...',然后我确实得到了每个输入序列打印的两个数字,但是来自 hping 的直接管道根本没有输出,除了^C 上的 ping 总结@
    • 我明白了。试试这个问题的前两个答案:serverfault.com/questions/294218/…
    • 是的,也在unix.stackexchange.com/a/61833/28354script -q /dev/null hping 使它成为行缓冲,虽然它有点难看。谢谢,+1!
    【解决方案2】:

    对 janos 解决方案的修改,以提供可用的 sn-p。

    请注意,当重定向到管道时,hping 的输出会完全缓冲,令人惊讶的是,这会极大地抑制解决方案的可移植性。请参阅https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipehttps://unix.stackexchange.com/questions/102403/turn-off-buffering-for-hping-in-openbsd

    在安装expect 包后,以下适用于OpenBSD:

    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"; }'
    

    在 OS X 上需要以下内容,因为它的 expect 没有伴随 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"; }'
    

    这是脚本的示例输出,显示前向路径拥塞,而返回路径很可能没有拥塞:

    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
    


    请注意,如果时钟不同步,那么您将是负数,尽管如此,它仍然可以很好地指示哪一方正在经历拥塞。

    下面的例子是通过相同的路径;注意一个值仍然随机上升和下降,而另一个值是单调变化的。

    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
    

    【讨论】:

      猜你喜欢
      • 2017-07-10
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 2019-06-13
      • 2016-01-04
      • 2021-01-01
      • 2014-10-19
      • 2020-09-29
      相关资源
      最近更新 更多