Python 优雅获取本机 IP 方法
见过很多获取服务器本地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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java的4大核心基础
Java的4大核心基础,很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识。本文小编总结了零基础学习Java编程语言的几个基础知识要点。希望能够对刚入门的Java新手有帮助。 01先了解什么是Java的四个方面 初学者先弄清这些Java的基本概念也是必不可少的,死记硬背肯定是不行的,重在理解,理解它们之间的区别与联系,分别有哪些应用。想想这些代码中用到了哪些知识点。不要一味地照着书本敲代码。而不去理解。 1.Java编程语言,即语法。 2.Java文件格式,即各种文件夹、文件的后缀。 3.Java虚拟机(JVM),即处理*.class文件的解释器。 4.Java应用程序接口(Java API)。 02掌握静态方法和属性 静态方法和属性用于描述某一类对象群体的特征,而不是单个对象的特征。Java中大量应用了静态方法和属性,这是一个通常的技巧。但是这种技巧在很多语言中不被频繁地使用。 理解静态方法和属性对于理解类与对象的关系是十分有帮助的,在大量的Java规范中,静态方法和属性被频繁使用。因此学习者应该理解静态方法和属性。Java在方法和属性的调用上是...
- 下一篇
2019最新Python3:基础语法
2019最新Python3:基础语法 什么是Python? Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。 Python 由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。 Python环境搭建 Python官网:https://www.python.org/ 下载地址:https://www.python.org/downloads/release 自行安装 Python程序的文件头格式 !/usr/bin/python3 -- coding: utf-8 -- author : liuhefei Time : 2019/11/1 desc: python程序的描述信息 Python编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码: -- coding: gbk -- Python标识符 Python标识符由字母,数字,下划线组成 第一个字符必须是字母表中字母或下划线 _ ,而不能是数字 标识符的其他的部分由字母、数...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启