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()))
# 有可能出现这个情况
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])"
# 可以封装成函数,方便 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

原文地址:https://www.cnblogs.com/hei-hei-hei/p/10489924.html

时间: 2024-08-28 19:52:33

python 获取自身ip的相关文章

Python获取客户端IP地址

获取客户端IP地址 if 'HTTP_X_FORWARDED_FOR' in request.META: ipaddress = request.META['HTTP_X_FORWARDED_FOR'] else: ipaddress = request.META['REMOTE_ADDR'] 原文地址:https://blog.51cto.com/14284354/2401482

python获取本地ip

def get_ip_address(ifname): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) return socket.inet_ntoa(fcntl.ioctl(s.fileno(),0x8915,struct.pack('256s', ifname[:15]))[20:24]) 1.套接字 2.通常,非Python程序以32位字节包的形式存储和使用IP地址.inet_aton(ip_addr)和inet_ntoa(pack

python获取代理IP

利用requests库获取代理,用Beautiful库解析网页筛选ip # -*- coding: utf-8 -*- import requests from bs4 import BeautifulSoup from threading import Thread headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0'} #定义获取IP函数

python 获取网站IP以及服务器

写了一个识别网站的ip以及服务器的代码,比较烂,希望大佬指教 1 import requests 2 import sys 3 import socket 4 5 def get_ip(url): # 获取IP 6 if 'http' in str(url): 7 url = url.split('//')[1] 8 ip = socket.gethostbyname(url) 9 else: 10 ip = socket.gethostbyname(url) 11 return ip 12 1

python 获取远程设备ip地址

python2.7 #!/usr/bin/env python # Python Network Programming Cookbook -- Chapter - 1 # This program is optimized for Python 2.7. # It may run on any other version with/without modifications. import socket def get_remote_machine_info(): remote_host =

python获取本地IP地址发送邮件

#!/usr/bin/env python #_*_coding:utf-8 _*_ import time import socket import fcntl import struct import smtplib from email.mime.text import MIMEText def get_ip_add(ifname): s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) return socket.inet_ntoa(fcnt

python 获取Linux IP

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 get_ip_

Python 获取CentOS主机信息

Python 获取主机IP地址 #!/usr/bin/env python #coding:utf-8 import os ip=os.popen("ifconfig eth0|grep 'inet addr'|awk -F ':' '{print $2}'|awk '{print $1}'") for i in ip: print "ip地址为:%s" %(i.strip()) #ip=ip.read().strip() #print ip Python获取系统的

python 练习获取当前ip

#!/usr/bin/python from subprocess import Popen,PIPE def getIfconfig():     data = Popen(['ifconfig'], stdout=PIPE)     new_data = data.stdout.read().split('\n\n')     return [i for i in new_data if i] def getIp(data):     dic = {}     for i in data: