Linux环境下Python获取IP地址与地理位置的实现
针对服务器自动配置需判断地理位置的场景,本文提供基于Python的Linux IP获取方案。通过Socket无感探测本机真实绑定IP,结合公共接口解析公网出口地址,并调用权威API定位国家代码。代码已全面适配Python 3环境,内置断网降级逻辑,可直接集成至自动化运维流程中。
核心需求与应用场景
在 LNMP 等一键安装包或自动化部署脚本中,经常需要识别服务器位置以优化软件源(如切换国内镜像)。此时通常面临两种网络环境:若服务器仅分配私网地址,需提取其网关段信息进行区域推断;若服务器直接绑定公网地址,则可将其作为地理位置的直接判定依据。本文将分场景演示如何利用 Python 快速稳定地完成上述数据采集。
获取本机实际绑定 IP
第1步:配置网络探测环境
目的:建立无实质数据传输的通信通道,使操作系统自动填充本机路由出口的网卡地址。入口:系统终端命令行。动作:初始化 IPv4 数据报套接字并发起单向连接。重要参数:协议族 AF_INET、类型 SOCK_DGRAM、目标节点 ('8.8.8.8', 80)。完成状态:内核完成路由表查找但不发出报文,getsockname() 成功返回有效的本地 IP 字符串。
第2步:执行脚本提取网卡地址
目的:将探测逻辑固化为可复用函数,并处理极端情况下的异常回退。入口:保存为 get_local_ip.py 后运行。动作:调用封装函数并遍历异常分支。重要参数:默认降级地址 127.0.0.1。完成状态:控制台直接输出格式为 x.x.x.x 的本机有效 IP。
#!/usr/bin/env python3
import socket
def get_local_ip():
"""通过 UDP 虚连接获取本机实际绑定的 IP 地址"""
try:
csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
csock.connect(('8.8.8.8', 80))
addr = csock.getsockname()[0]
csock.close()
return addr
except socket.error:
return "127.0.0.1"
if __name__ == "__main__":
print(get_local_ip())
提取服务器公网出口 IP
第1步:创建外网请求与解析模块
目的:访问第三方公开主页,利用正则表达式清洗页面文本并提取出口 IP。入口:定义类结构并实例化调用。动作:按优先级尝试多个数据源,读取响应体并执行模式匹配。重要参数:匹配规则 \d+\.\d+\.\d+\.\d+、编码格式 utf-8。完成状态:成功返回符合 IPv4 格式的字符串,若连续失败则提示网络异常。
#!/usr/bin/env python3
import re
import urllib.request
class GetPublicIP:
def getip(self):
# 备选数据源列表,优先访问稳定性高的接口
urls = [
"https://api.ipify.org/?format=text",
"https://ifconfig.me/ip"
]
for url in urls:
try:
return self.fetch_ip(url)
except Exception:
continue
return "查询失败,请检查网络连通性"
def fetch_ip(self, url):
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
with urllib.request.urlopen(req, timeout=5) as resp:
content = resp.read().decode('utf-8', errors='ignore').strip()
match = re.search(r'\d+\.\d+\.\d+\.\d+', content)
if match:
return match.group(0)
raise ValueError("未找到IP匹配项")
if __name__ == "__main__":
print(GetPublicIP().getip())
解析 IP 归属地与地区代码
第1步:调用地理定位接口
目的:将原始 IP 转换为结构化的地理位置数据(如国家/地区缩写)。入口:通过命令行参数传入目标 IP。动作:拼接请求 URL,发送 GET 请求并反序列化 JSON 载荷。重要参数:API 端点 http://ip.taobao.com/service/getIpInfo.php、校验字段 code。完成状态:当 code 等于 '0' 时,标准输出打印对应 country_id 值(如 CN)。
#!/usr/bin/env python3
import sys
import urllib.request
import json
def get_ip_area(target_ip):
api_url = f"http://ip.taobao.com/service/getIpInfo.php?ip={target_ip}"
try:
req = urllib.request.Request(api_url)
with urllib.request.urlopen(req, timeout=10) as resp:
data_dict = json.loads(resp.read().decode('utf-8'))
if data_dict['code'] == '0':
return data_dict['data']['country_id']
else:
return data_dict.get('data', '未知区域')
except Exception:
print(f"Usage: {sys.argv[0]} ")
sys.exit(1)
if __name__ == "__main__":
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} ")
sys.exit(1)
print(get_ip_area(sys.argv[1]))
环境适配与风险提示
在实际部署或修改系统配置文件(如源列表、网络策略)前,请务必对当前 /etc/yum.repos.d/ 或 /etc/apt/ 相关目录执行完整备份,防止脚本误判导致软件包索引损坏。本系列工具均强依赖 DNS 解析与外网连通性,若在严格隔离的内网或代理受限环境中运行,请提前替换测试域名或使用本地维护的静态映射表。此外,原始参考代码基于 Python 2 编写,现已全面升级至 Python 3 标准库规范(urllib2 迁移为 urllib.request,print 改为函数形式),可直接对接现代 Linux 发行版。
简要总结
通过上述三个维度的脚本组合,能够完整覆盖从本机物理/逻辑地址提取、公网出口识别到宏观地理位置判定的全链路需求。合理结合这些片段,可为自动化部署工具提供精准的网络环境感知能力。以上就是Linux环境下Python获取IP地址与地理位置的详细实现,更多关于自动化运维脚本编写的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













