确定python中CONNECTED接口(linux)的IP地址
在我的linux机器上,3个网络接口中有1个可能实际连接到互联网。我需要获取当前连接的接口的IP地址,请记住,我的其他2个接口可能分配了IP地址,只是不能连接。确定python中CONNECTED接口(linux)的IP地址
我可以通过每个接口ping一个网站来确定哪个网络具有连通性,但是我希望比等待ping时间更快。我想不必依靠外部网站。
更新:
我所有的接口可能有IP地址和网关。这是针对嵌入式设备的。所以我们允许用户选择说eth0
和eth1
。但是,如果用户告诉我们使用的界面上没有连接,我们就会说eth2
哪个(理论上)将始终有效。
所以我需要做的是首先检查用户的选择是否连接,如果是这样返回该IP。否则,我需要获得IP eth2
。我可以很好地获得接口的IP,只是确定哪一个实际连接。
如果系统的默认网关是可靠的,那么从route -n
的输出中抓取包含" UG "
(注意空格)的行将包含活动接口的网关IP和接口名称。
的解决方案是在这里:http://code.activestate.com/recipes/439093-get-names-of-all-up-network-interfaces-linux-only/
import fcntl
import array
import struct
import socket
import platform
"""
global constants. If you don't like 'em here,
move 'em inside the function definition.
"""
SIOCGIFCONF = 0x8912
MAXBYTES = 8096
def localifs():
"""
Used to get a list of the up interfaces and associated IP addresses
on this machine (linux only).
Returns:
List of interface tuples. Each tuple consists of
(interface name, interface IP)
"""
global SIOCGIFCONF
global MAXBYTES
arch = platform.architecture()[0]
# I really don't know what to call these right now
var1 = -1
var2 = -1
if arch == '32bit':
var1 = 32
var2 = 32
elif arch == '64bit':
var1 = 16
var2 = 40
else:
raise OSError("Unknown architecture: %s" % arch)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
names = array.array('B', '\0' * MAXBYTES)
outbytes = struct.unpack('iL', fcntl.ioctl(
sock.fileno(),
SIOCGIFCONF,
struct.pack('iL', MAXBYTES, names.buffer_info()[0])
))[0]
namestr = names.tostring()
return [(namestr[i:i+var1].split('\0', 1)[0], socket.inet_ntoa(namestr[i+20:i+24])) \
for i in xrange(0, outbytes, var2)]
print localifs()
有人投票...如果他们关心评论它会有助于我了解我的错误! – jknair 2010-10-07 20:08:30
海报的问题更加抽象,您特别发布的代码是关于具有“链接”的接口,因为海报说每个接口都可能有链接,但可能无法连接到互联网。 – synthesizerpatel 2010-10-07 20:30:54
什么分类的界面为 “下”?它没有网关吗?它有一个网关,但网关将无法访问? – 2010-10-07 19:35:07
只有通过查看IP才能确定路由。作为一个例子,不止一个接口可以路由到互联网(认为有线和无线)。它们中的任何一个都可以(直接)路由到互联网,但可能在处理某些流量的路径中有代理。 – Joe 2010-10-07 19:35:21
除非您使用ICMP,TCP/IP,UDP等与互联网中的某个服务器建立连接,否则没有任何连接到Internet的事情。除非您与某个服务通话并收到回复,否则不能说您已连接否则到互联网。 – 2010-10-07 19:59:42