怎么用Linux shell脚本获取外网IP地址

发布时间:2022-02-17 15:35:18 作者:iii
来源:亿速云 阅读:477
# 怎么用Linux shell脚本获取外网IP地址

在Linux系统管理中,获取服务器的公网IP地址是一个常见需求。无论是用于远程访问、网络配置还是自动化脚本,准确获取外网IP都至关重要。本文将介绍5种通过Shell脚本获取公网IP的方法,并分析它们的优缺点。

## 方法一:使用curl查询公共API

```bash
#!/bin/bash

# 使用ipinfo.io服务
PUBLIC_IP=$(curl -s https://ipinfo.io/ip)

# 使用checkip.amazonaws.com
# PUBLIC_IP=$(curl -s https://checkip.amazonaws.com)

echo "Public IP: $PUBLIC_IP"

优点: - 简单直接,返回纯净的IP地址 - 亚马逊服务稳定性高

缺点: - 依赖第三方服务可用性 - 需要安装curl工具

方法二:通过dig查询DNS记录

#!/bin/bash

# 使用OpenDNS的解析服务
PUBLIC_IP=$(dig +short myip.opendns.com @resolver1.opendns.com)

echo "Public IP: $PUBLIC_IP"

优点: - 不依赖HTTP服务 - OpenDNS解析速度快

缺点: - 需要安装dig工具(dnsutils包) - 某些网络可能屏蔽DNS查询

方法三:使用wget替代curl

#!/bin/bash

# 使用icanhazip.com服务
PUBLIC_IP=$(wget -qO- https://icanhazip.com)

echo "Public IP: $PUBLIC_IP"

优点: - 适合未安装curl但安装了wget的系统 - 返回结果无多余信息

缺点: - 同样依赖第三方服务 - 需要处理SSL证书验证(可加--no-check-certificate

方法四:多服务验证(推荐生产环境使用)

#!/bin/bash

# 定义多个IP查询服务
SERVICES=(
    "https://ipinfo.io/ip"
    "https://ifconfig.me"
    "https://api.ipify.org"
)

# 尝试不同服务直到获取成功
for service in "${SERVICES[@]}"; do
    if PUBLIC_IP=$(curl -s --connect-timeout 5 "$service"); then
        [[ -n "$PUBLIC_IP" ]] && break
    fi
done

# 验证IP格式
if [[ "$PUBLIC_IP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
    echo "Valid Public IP: $PUBLIC_IP"
else
    echo "Failed to get valid IP" >&2
    exit 1
fi

优点: - 增加服务冗余,提高可靠性 - 包含基础IP格式验证 - 设置超时避免长时间阻塞

缺点: - 脚本复杂度稍高 - 仍依赖外部服务

方法五:通过路由表获取(不依赖外部服务)

#!/bin/bash

# 获取默认路由的出口IP
INTERFACE=$(ip route show default | awk '/default/ {print $5}')
PUBLIC_IP=$(ip addr show $INTERFACE | grep "inet " | awk '{print $2}' | cut -d/ -f1)

echo "Network Interface: $INTERFACE"
echo "Public IP: $PUBLIC_IP"

注意:此方法实际获取的是本地网络接口IP,仅在以下情况有效: 1. 服务器直接配置了公网IP 2. 处于1:1 NAT环境中

错误处理最佳实践

完善的脚本应该包含错误处理:

#!/bin/bash

set -euo pipefail

get_ip_from_service() {
    local url=$1
    curl -s --connect-timeout 3 "$url" | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
}

SERVICES=(
    "https://ipinfo.io/ip"
    "https://checkip.amazonaws.com"
    "https://icanhazip.com"
)

for service in "${SERVICES[@]}"; do
    if IP=$(get_ip_from_service "$service"); then
        echo "$IP"
        exit 0
    fi
done

echo "All IP services failed" >&2
exit 1

性能优化建议

  1. 缓存结果:将获取的IP保存到临时文件,短期内重复查询直接读取缓存 “`bash CACHE_FILE=”/tmp/public_ip.cache” CACHE_TIME=300 # 5分钟

if [[ -f “\(CACHE_FILE" && \)(stat -c %Y “\(CACHE_FILE") -gt \)(date -d “now - \(CACHE_TIME seconds" +%s) ]]; then cat "\)CACHE_FILE” else get_public_ip | tee “$CACHE_FILE” fi


2. **并行查询**:使用`wait`和后台进程同时查询多个服务

## 安全注意事项

1. 避免将IP查询服务用于敏感系统
2. 考虑使用企业内部的IP查询端点
3. 对返回结果进行格式验证防止注入攻击

## 结论

对于大多数场景,推荐使用方法四的多服务验证方案,它在可靠性和复杂性之间取得了良好平衡。在受限环境中,可以尝试通过路由表获取(方法五),但需要注意其局限性。

选择方案时应考虑:
- 网络环境限制
- 对第三方服务的依赖容忍度
- 脚本运行频率
- 结果的精确性要求

这篇文章提供了从基础到进阶的多种解决方案,包含错误处理、性能优化和安全建议,总字数约950字,采用Markdown格式,可以直接用于技术文档或博客发布。

推荐阅读:
  1. Linux系统之DHCP
  2. 如何使用Linux终端获取公共IP

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

linux shell ip

上一篇:Shell怎么监控网站URL运行情况

下一篇:shell布尔运算符与逻辑运算符有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》