1. 程式人生 > >Python 優雅獲取本機 IP 方法

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])"
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優雅獲取 IP 方法

見過很多獲取伺服器本地IP的程式碼,個人覺得都不是很好。從網上搜索到一個靠譜的指令碼,分享一下! 通過 UDP 獲取本機 IP,目前見過最優雅的方法 這個方法是目前見過最優雅獲取本機伺服器的IP方法了。沒有任何的依賴,也沒有去猜測機器上的網路裝置資訊。 而且是利用 UDP 協議來實現的,生成一個UDP

Python 優雅獲取 IP 方法

見過很多獲取伺服器本地IP的程式碼,個人覺得都不是很好,例如以下這些不推薦:靠猜測去獲取本地IP方法#!/usr/bin/env python # -*- coding: utf-8 -*- import socket import fcntl import struct

Python+socket獲取IP地址

import socket hostname = socket.gethostname() IPinfo = socket.gethostbyname_ex(hostname) LocalIP = IPinfo[2][0]  # [2][0] 2保持不變,如果刪除[0

python 獲取IP

socket gets () close sock nal net get def 1 def get_host_ip(): 2 """ 3 查詢本機ip地址 4 :return: ip 5 """ 6 try: 7

python 獲取IP的三種方式

gif spa .get ESS usr span eth byname file python獲取本機IP的方式 第一種: #!/usr/bin/python import socket import fcntl import struct def ge

python 獲取 IP

.so blog 本機 查詢 def conn tps sock 緩存 原文 通過 UDP 獲取本機 IP,目前見過最優雅的方法 這個方法是目前見過最優雅獲取本機服務器的IP方法了。沒有任何的依賴,也沒有去猜測機器上的網絡設備信息。 而且是利用 UDP 協議來實現的,生成

Python小功能-獲取IP

socket start name finall close con def conn print shell獲取IP太麻煩,python實現還是快點 獲取本機IP 1.方法一 第一種更好用,第二種會出現127.0.0.1的情況import socket def get_

python 獲取IP地址,檢測埠是否被佔用

import socket def get_host_ip(): """ get host ip address 獲取本機IP地址 :return: """ s = socket.socket(socket.

linux程式設計獲取IP地址的三種方法

                這是一項不太清晰而且沒有多大意義的工作。一個原因是網路地址的設定非常靈活而且都是允許使用者進行個性

Python獲取IP、計算機名、mac地址

#_*_ coding:utf-8 _*_ import socket import getpass import platform import uuid     #通用唯一識別碼 myname1=socket.getfqdn(socket.gethostname()

socket獲取IP地址方法

    獲取計算機的名稱和IP地址可以通過呼叫winsock裡面的函式完成,下面上是用到的函式:1.WSAStartup(),此函式在應用程式中初始化windows sockets DLL,這個函式呼叫成功後,才可以呼叫其他的api函式。 2.WSACleanup()函式,

window上獲取IP地址方法--windows程式設計

使用獲取本地地址的方法比較多,簡單點的就是ipconfig命令就好了,本地網路之類的圖形介面而本次是使用作為一個程式設計師的方式來獲取本地的ip地址。 InitSock.h如下: #include &

Python獲取IP地址

使用Python可以用很簡單的方法得到本機IP地址,不過在Windows和Linux下的方法稍有不一樣的, Windows下獲得IP地址的方法 方法一 使用撥號上網的話,一般都有一個本地ip和一個外網ip,使用python可以很容易的得到這兩個ip 使用gethos

獲取IP地址的小腳

ash class p地址 nbsp 地址 int done 獲取本機 onf 獲取本機私網地址(1個) 1 #!/bin/bash 2 # Author : standby 3 # Date : 2017-05-18 4 # D

獲取IP(適用於Linux系統)

tex cat 獲取本機 smo cal network enum print inet6 獲取本機IP(適用於Linux系統) /** * @desc 獲取本機IP(適用於Linux系統) * @return Ip */ public static String getL

unity 獲取ip地址

ipa mil work get hostname [] 本機 取ip gethost IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName()); //Dns.GetHostName()獲取本機名Dns.GetH

qt獲取ip

獲取本機ip host == spa 獲取本機ip地址 contains proto post bstr //獲取本機IP QString getIP(QString localHost) { QString ipAddr; #if 0

獲取IP地址

down pos -m 兩個 div mar inter 獲取本機ip地址 work 問題描述 一臺電腦有IPV4地址和IPV6地址,目前使用的基本是IPV4地址, 有些情況還有多個網卡,有線的、無線的、還有vmare虛擬的兩個網卡。 獲取所有的IP地址 //獲取本機IP

獲取IP及在IP的基礎上自增1(只針對有一個IP的機器)

turn else data 返回 主機名 add cleanup done get 1、獲取本機IP 1 char* getLocalIP() 2 { 3 WSADATA wsaData; 4 int err = WSAStartup(MAKEW

windows下用C++獲取IP地址

ali 返回 轉換成 data info AC ctrl nag != BSTR CamUtilsCtrl::GET_TERM_IP(void){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString strResult