例えば、サーバーのローカル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