linux脚本中用ping命令配合$?退出码判断网络连通性:成功返回0,失败返回非0;常用-c 1、-w超时和>/dev/null静默输出,并可封装为is_online()等函数复用。

在 Linux 脚本中做条件判断来检查网络连通性,核心是用 ping 命令配合退出状态码($?)——它不输出内容,只告诉脚本“通”还是“不通”。
用 ping -c 和 $? 判断连通性
ping 成功时返回 0,失败(超时、不可达、域名解析失败等)返回非 0。这是脚本里最可靠、最轻量的判断依据。
- 测试公网连通性(如 DNS 服务器):
if ping -c 1 -W 2 8.8.8.8 > /dev/null; then echo "网络正常"; else echo "网络异常"; fi - 测试域名解析 + 连通性(如百度):
if ping -c 1 -W 3 www.baidu.com > /dev/null; then echo "可上网且 DNS 正常"; else echo "可能断网或 DNS 失效"; fi - 关键参数说明:
• -c 1:只发 1 个包,避免阻塞
• -W 2:2 秒无响应即超时,防止卡住
• > /dev/null:屏蔽输出,只留状态
区分不同故障场景的判断逻辑
单靠一次 ping 可能不够精准,可组合多个测试提升判断准确性:
- 先测回环:
ping -c 1 -W 1 127.0.0.1 > /dev/null→ 失败说明本机协议栈异常 - 再测网关:
ping -c 1 -W 1 $(ip route | awk '/default/ {print $3}' 2>/dev/null)→ 失败说明内网不通 - 最后测公网 IP(如 8.8.8.8)和域名(如 www.baidu.com)→ 若前者通后者不通,基本确定是 DNS 问题
注意防火墙和禁 ping 场景
有些服务器或网络策略会丢弃 ICMP 包,导致 ping 返回失败,但实际 HTTP/SSH 仍可用。这时需换方式验证:
- 用
curl -I --connect-timeout 3 -s http://www.baidu.com > /dev/null判断 Web 层连通性 - 用
nc -z -w 3 8.8.8.8 53 && echo ok || echo fail测试特定端口(如 DNS 的 53 端口) - 这些命令同样靠退出码判断,可无缝接入 if 语句
写成可复用的函数更实用
把常用检测封装成函数,提高脚本可读性和复用性:
is_online() { ping -c 1 -W 2 8.8.8.8 > /dev/null; }is_dns_ok() { ping -c 1 -W 3 www.baidu.com > /dev/null; }- 然后直接:
if is_online && is_dns_ok; then ... fi











