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またはIP bond0のがある場合は、そのようなコードはおそらく失敗しており、他のプラットフォームに簡単に移植ません。

推奨しない:ローカルIPホスト名を通じて取得します

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:××× 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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

この方法では、ホスト名を取得することで、その後、ホスト名で抗IPマシンを調査します。この方法は推奨されません。機械の多くは、このホスト名の設定を調節していないため。

他のいくつかのサーバは、マシンのアドレスで/ etc / hostsファイルのホスト名に追加されることで、このような行為は不可能ではないですが、あなたが設定している場合は127.0.0.1になりました、それから抜け出すことのIPアドレスです。

IPによるマシンへのUDPアクセスは、現在最もエレガントな方法を見て

このアプローチは、サーバーのIPを取得するために、マシンのために最もエレガントな方法を見ています。依存性、また機械情報の推測ネットワークデバイスにありません。

そのようなUDPプロトコルにそれらのIPヘッダを置くように、UDPパケットを生成し、UDPプロトコルを使用して実施されると、マシンはUDPパケットからIPアドレスを取得します。

この方法では、外部の入札に本物ではないので、使用パケットキャプチャツールは表示されません。しかし、それはあなたが頻繁に通話がより多くの時間がかかり、あなたがIPを照会する必要がある場合は、ここですることができ、大幅に改善性能が得られるキャッシュされている場合は、UDPポートに適用されます。

# 在 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

おすすめ

転載: blog.51cto.com/14246112/2449102