Python 正则读取 /etc/resolv.conf 仅返回 IP 地址,感觉快成功了

1 投票
3 回答
2773 浏览
提问于 2025-04-16 14:39

我在写一个Python脚本,遇到了一个问题。这个脚本应该打开一个叫做/etc/resolv.conf的文件,逐行读取内容,然后只返回里面的IP地址。虽然它似乎找到了IP地址,但却没有告诉我具体的内容是什么。你知道怎么才能让它告诉我找到的字符串吗?

这是我写的函数:

def get_resolv():
    nameservers=[]
    rconf = open("/etc/resolv.conf","r")
    line = rconf.readline()
    while line:
        try:
            ip = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line)


        except:
            ip = "none set"
        print ip
        nameservers.append(ip)
        line= rconf.readline()

    return nameservers

这是调用这个函数时的输出:

None
<_sre.SRE_Match object at 0xb76964b8>
<_sre.SRE_Match object at 0xb7696db0>

3 个回答

1

Python3

def get_resolvers():
"""
if using WSL will access /etc/resolv.conf and parse the host address
:return: str ip address
"""
resolvers = []
try:
    with open("/etc/resolv.conf", encoding='utf-8') as resolvconf:
        for line in resolvconf.readlines():
            line = line.split('#', 1)[0].rstrip()
    if 'nameserver' in line:
        resolvers.append(line.split()[1])
    return resolvers[0] if len(resolvers) > 0 else "127.0.0.1"
except Exception as err:
    return "127.0.0.1"
2

另一种方法

>>> data=open("/etc/resolv.conf").read().split()
>>> for item in data:
...     if len( item.split(".") ) == 4:
...          print item
...
192.168.0.1
2

re.search 会返回一个叫做 匹配对象。这个对象有很多属性,可以告诉你关于匹配的情况。

如果你想获取整个匹配的文本,可以使用 ip.group(0) 或者 ip.group()

另外,如果没有找到匹配,re.search 不会抛出错误,而是会返回 None。所以你的代码应该像这样:

ip = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line)

if ip is None:
    ip = "none set"

撰写回答