开发者社区> Python学习者> 正文

Python 优雅获取本机 IP 方法

简介: 见过很多获取服务器本地IP的代码,个人觉得都不是很好,例如以下这些 不推荐:靠猜测去获取本地IP方法 #!/usr/bin/env python # -*- coding: utf-8 -*- import socket import fcntl import struct def get_ip_address(ifname): s = socket.
+关注继续查看

见过很多获取服务器本地IP的代码,个人觉得都不是很好,例如以下这些

不推荐:靠猜测去获取本地IP方法

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import socket
import fcntl
import struct
 
def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  # SIOCGIFADDR
        struct.pack('256s', ifname[:15])
    )[20:24])
 
print "br1 = "+ get_ip_address('br1')
print "lo = " + get_ip_address('lo')
print "virbr0 = " + get_ip_address('virbr0')

这类代码带有猜测的行为。

如果机器上只有eth0 或者 只有bond0上有IP,那么此类代码都有可能失败,而且还不容易移植到其他平台上。

不推荐:通过hostname来获取本机IP

import socket
print(socket.gethostbyname(socket.gethostname()))
# Python学习交流QQ群:857662006  
# 有可能出现这个情况
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
socket.gaierror: [Errno -2] Name or service not known

这个方法是通过获取hostname,然后再通过hostname反查处机器的IP。这个方法也是不推荐的。因为很多的机器没有规范这个hostname的设置。

另外就是有些服务器会在 /etc/hosts 中添加本机的hostname的地址,这个做法也不是不可以,但是如果设置成了 127.0.0.1,那么获取出来的IP就都是这个地址了。

通过 UDP 获取本机 IP,目前见过最优雅的方法

这个方法是目前见过最优雅获取本机服务器的IP方法了。没有任何的依赖,也没有去猜测机器上的网络设备信息。

而且是利用 UDP 协议来实现的,生成一个UDP包,把自己的 IP 放如到 UDP 协议头中,然后从UDP包中获取本机的IP。

这个方法并不会真实的向外部发包,所以用抓包工具是看不到的。但是会申请一个 UDP 的端口,所以如果经常调用也会比较耗时的,这里如果需要可以将查询到的IP给缓存起来,性能可以获得很大提升。

# 在 shell 中可以一行调用,获取到本机IP
python -c "import socket;print([(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])"
10.12.189.16

# 可以封装成函数,方便 Python 的程序调用
import socket
 
def get_host_ip():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))
        ip = s.getsockname()[0]
    finally:
        s.close()
 
    return ip

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
python爬取数据中的headers和代理IP问题
python爬取数据中的headers和代理IP问题
28 0
01 奇妙的Python库之【socket(获取本机ip地址)】
01 奇妙的Python库之【socket(获取本机ip地址)】
59 0
Python:通过socket.gethostbyname获取域名的ip地址
Python:通过socket.gethostbyname获取域名的ip地址
25 0
python之代理ip的配置与调试
python之代理ip的配置与调试
47 0
python爬取数据时IP被禁怎么解决
python3如何使用爬虫代理获取数据
64 0
如何使用python+urllib库+代理IP爬取新闻数据
如何使用python+urllib库+代理IP爬取数据
68 0
python测试request代理IP是否替换
今天我们来讨论如何使用Python测试Request模块中的HTTP代理是否成功替换了我们的真实IP。
80 0
socket库:Python实现TCP/IP客户和服务器通信
socket库:Python实现TCP/IP客户和服务器通信
210 0
Python/PHP:免费IP归属地查询接口和通过ip获取大致位置信息
Python/PHP:免费IP归属地查询接口和通过ip获取大致位置信息
410 0
Python爬虫网页IP被封的问题分析
如果你在爬虫过程中有遇到“您的请求太过频繁,请稍后再试”,或者说代码完全正确,可是爬虫过程中突然就访问不了,那么恭喜你,你的爬虫被对方识破了,轻则给予友好提示警告,严重的可能会对你的ip进行封禁,所以代理ip那就尤为重要了。今天我们就来谈一下代理IP,去解决爬虫被封的问题。
424 0
Python爬虫必备技能,使用 动态代理ip 获取Steam 热销商品 示例
动态代理ip 相信大家肯定都听说过,或者已经使用过。 本篇文章就来介绍一下什么是动态代理ip,还有一个使用代理ip爬取Youtube游戏模块主页。 使用动态ip有很多好处,比如保护你的网络免受外部攻击、屏蔽你的IP地址等。 那本篇文章就来研究一下这个动态ip,对这方面不了解的小伙伴正好可以一起学习一下。
398 0
Python爬虫系列3-通过Ip地址定位目标所在区域
在现如今的互联网时代,我们越来越依赖网络,甚至网络已经融入了我们的日常生活,甚至没有办法想象如果没有了网络,会造成什么样的情景?。。。
206 0
1行Python代码,获取对方的IP地址
如何验证域名和服务器IP是否绑定成功呢?
78 0
Python使用Redis实现IP代理池
Python使用Redis实现IP代理池
232 0
python——脚本实现检测目标ip是否存在rce漏洞
python——脚本实现检测目标ip是否存在rce漏洞
221 0
+关注
Python学习者
文章
问答
视频
相关电子书
更多
双剑合璧-Python和大数据计算平台的结合
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多