Ubuntu 上部分丢包的 ping 行为

Ubuntu 上部分丢包的 ping 行为

我专门查看在 Ubuntu 服务器上运行 ping 的返回变量,我正在寻找的变量是:错误状态、stdout 上的输出、stderr 上的输出。

当 ping 主机时,可能会发生以下三种情况:

  1. 主机对所有数据包进行应答(无错误)
  2. 主机回答零数据包(错误)
  3. 主机对某些数据包进行应答(未指定的行为)

我已经通读了man ping几次,似乎找不到在这种情况下我应该期待的东西。

我无法对此进行测试,我唯一可以访问的机器是运行 Ubuntu 的 Linode 虚拟服务器和运行 Snow Leopard 的 Macbook(可能与我的服务器使用的 PING 程序不同)

我应该期望第三种情况的返回变量是什么?

答案1

Linux 上甚至 Ubuntu 上都有多个可用的 ping 实用程序。默认的(Ubuntu main 中唯一的一个)来自iputilsiputils-ping)。从 iputils 20100418 开始,可能的返回状态(对于任一pingIPv6 实用程序 或配套的 IPv6 实用程序)为:ping6

  • 如果您通过该-V选项,则为 0。
  • 255 如果ping不能放弃权限(这不应该发生)。
  • 1 如果在解析主题名称时发生错误ping6 -N.
  • 正常退出时为 0 或 1:
    • 1 如果没有收到回复。
    • -w1 如果您使用或选项设置截止时间-W,并且收到的回复数量小于发送的请求数量。
    • 0 否则,即如果有截止日期且已收到所有预期答复,或者如果没有截止日期且至少收到一份答复。
  • 2 在所有其他情况下。

如果您需要进行更精细的区分,则必须解析输出。该实用程序使用 stderr 来显示致命错误和一些警告,使用 stdout 来显示各种状态报告和信息性消息。这些消息是供人类使用的,因此不要指望能够轻松解析它们,每次版本发布或您想在不同的平台上工作时都必须更新解析器,并记住设置LC_MESSAGES=C以防万一ping 曾经被翻译过(目前还没有)。很少有用例需要解析输出 - 通常您需要知道的是 2 = DNS 查找失败,1 = 主机未响应,0 = 成功。

答案2

如果不知道您使用什么语言编写代码,则很难为您提供具体信息,但这里有一个关于输出的小入门。

error、stdout、stderr 不是变量,而是 Unix 二进制文件可以返回的输出类型。

stdout - 这是程序输出到屏幕(在许多情况下)或文件(如果重定向)或另一个程序的标准文本,可以使用以下命令捕获它

program > file

stderr - 这是输出到错误流的文本,是不会被 stdout 流的任何重定向捕获的第二个输出。您可以使用以下命令捕获此内容

program 2> file

错误 - 这是程序完成后返回的代码。成功通常由 0 表示。您可以使用以下命令捕获此信息

#!/bin/bash
program
echo $?

您可以在 Wikipedia 页面找到有关流的更多信息:标准_流。有很好的关于在 bash 中捕获流的文档bash手册

相关内容