我专门查看在 Ubuntu 服务器上运行 ping 的返回变量,我正在寻找的变量是:错误状态、stdout 上的输出、stderr 上的输出。
当 ping 主机时,可能会发生以下三种情况:
- 主机对所有数据包进行应答(无错误)
- 主机回答零数据包(错误)
- 主机对某些数据包进行应答(未指定的行为)
我已经通读了man ping
几次,似乎找不到在这种情况下我应该期待的东西。
我无法对此进行测试,我唯一可以访问的机器是运行 Ubuntu 的 Linode 虚拟服务器和运行 Snow Leopard 的 Macbook(可能与我的服务器使用的 PING 程序不同)
我应该期望第三种情况的返回变量是什么?
答案1
Linux 上甚至 Ubuntu 上都有多个可用的 ping 实用程序。默认的(Ubuntu main 中唯一的一个)来自iputils(iputils-ping
)。从 iputils 20100418 开始,可能的返回状态(对于任一ping
IPv6 实用程序 或配套的 IPv6 实用程序)为:ping6
- 如果您通过该
-V
选项,则为 0。 - 255 如果
ping
不能放弃权限(这不应该发生)。 - 1 如果在解析主题名称时发生错误
ping6 -N
. - 正常退出时为 0 或 1:
- 1 如果没有收到回复。
-w
1 如果您使用或选项设置截止时间-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手册。