我尝试使用此命令:
name = socket.gethostname()
address_info = socket.gethostbyname(name)
但这会返回IP地址169.x.x.x
而不是我的真实地址(192.168.x.x
),那是因为我的机器有几张network
卡。
如何检测我的真实IP地址?
答案 0 :(得分:1)
您可以使用netifaces。它将使您的任务变得更简单
import netifaces
netifaces.interfaces()
输出将是所有接口的列表
['lo0', 'gif0', 'stf0', 'en0', 'en1', 'fw0']
您可以像这样进一步深入研究-
netifaces.ifaddresses('en0')
输出应为-
{18: [{'addr': '00:12:34:56:78:9a'}], 2: [{'broadcast':
'10.255.255.255', 'netmask': '255.0.0.0', 'addr': '10.16.1.4'}],
30: [{'netmask': 'ffff:ffff:ffff:ffff::', 'addr':
'fe80::123:4567:89ab:cdef%en0'}]}
查找接口地址
netifaces.ifaddresses('en0')[netifaces.AF_LINK]
输出
[{'addr': '00:12:34:56:78:9a'}]
您可以遍历所有接口并检索IP地址,例如-
for interface in netifaces.interfaces():
... for link in netifaces.ifaddresses(interface)[netifaces.AF_INET]:
... print link['addr']
答案 1 :(得分:1)
您可以使用netifaces软件包:Doc
您对“真实”地址的含义感到困惑,所有网络接口都有权使用一个或多个IP地址,并且它们是真实的。
但是,如果您要选择一个可以将您连接到互联网的特定IP地址,那么您可以选择该接口并获取其主要IP地址。
也许这段代码会有所帮助:
import netifaces
def main():
for item in netifaces.interfaces():
print(netifaces.ifaddresses(item))
print("\n")
if __name__== "__main__":
main()
如果您想了解面向外部网络的接口,请使用以下代码:
print(netifaces.gateways()['default'][netifaces.AF_INET][0])
答案 2 :(得分:0)
也许您可以通过这种方式解决问题。
import socket
def my_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.connect(('stackoverflow.com', 1027))
except socket.error:
return None
return s.getsockname()[0]
答案 3 :(得分:0)
这对您有用吗?
from pyroute2 import IPRoute
with IPRoute() as ipr:
op = ipr.route('get', dst='8.8.8.8') #Find route to the google dns server
for tup in op[0]['attrs']:
if tup[0] == 'RTA_PREFSRC': # Preferred source address will be your ip address
print(tup[1])