在Python中确定连接接口的IP地址(Linux)
在我的Linux电脑上,有三个网络接口,其中一个可能是连接到互联网的。我需要找出当前连接的接口的IP地址,但要注意,其他两个接口可能也有IP地址,只是没有连接。
我可以通过每个接口去ping一个网站,看看哪个接口可以连接,但我希望能更快一些,而不是等着ping超时。而且我不想依赖外部网站是否在线。
更新:
我的所有接口可能都有IP地址和网关。这是为了一个嵌入式设备。所以我们允许用户在比如说eth0
和eth1
之间选择。但是如果用户选择的接口没有连接,我们就退回到eth2
,理论上这个接口总是能用。
所以我需要做的就是先检查用户选择的接口是否连接,如果连接了就返回那个IP地址。如果没有连接,我就需要获取eth2
的IP地址。我可以顺利获取接口的IP地址,只是需要判断哪个接口实际上是连接的。
2 个回答
0
解决方案在这里: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()
0
如果系统的默认网关很可靠,那么你可以从运行 route -n
命令的结果中找到相关信息。你要找的那一行包含 " UG "
(注意中间有空格),这一行会显示网关的IP地址和当前活动接口的名称。