python - 从每行的/etc/hosts中获取主机名值

4 投票
3 回答
15250 浏览
提问于 2025-04-17 19:56

我有一个定时任务,它使用AWS的PHP工具来更新/etc/hosts文件,这个文件里会写入当前EC2的私有IP地址和每台服务器的友好主机名。

现在我想用Python逐行读取这个/etc/hosts文件,只提取出主机名。

这里是一个/etc/hosts文件的例子:

127.0.0.1              localhost localhost.localdomain
10.10.10.10            server-1
10.10.10.11            server-2
10.10.10.12            server-3
10.10.10.13            server-4
10.10.10.14            server-5

到目前为止,我在Python中写的代码是:

    hosts = open('/etc/hosts','r')
    for line in hosts:
        print line

我想做的就是创建一个只包含主机名的列表(比如server-1、server-2等等)。有人能帮我一下吗?

3 个回答

3

这段代码应该能返回所有的主机名,并且还能处理行内注释。

def get_etc_hostnames():
    """
    Parses /etc/hosts file and returns all the hostnames in a list.
    """
    with open('/etc/hosts', 'r') as f:
        hostlines = f.readlines()
    hostlines = [line.strip() for line in hostlines
                 if not line.startswith('#') and line.strip() != '']
    hosts = []
    for line in hostlines:
        hostnames = line.split('#')[0].split()[1:]
        hosts.extend(hostnames)
    return hosts
9

我知道这个问题已经有点老了,而且技术上也解决了,但我想提一下,现在有一个库可以用来读取(和写入)hosts文件:https://github.com/jonhadfield/python-hosts

下面的代码和之前被接受的答案效果是一样的:

from python_hosts import Hosts
[entry.names for entry in hosts.Hosts().entries 
             if entry.entry_type in ['ipv4', 'ipv6']

不过和上面的答案不同——老实说,上面的答案非常简单,满足需求,而且不需要额外的库——python-hosts可以处理行注释(但不能处理行内注释),而且它的测试覆盖率达到了100%。

7

在编程中,有时候我们需要在代码里做一些判断,比如说判断一个条件是否成立。如果条件成立,就执行某些操作;如果不成立,就执行其他操作。这种判断的方式叫做“条件语句”。

条件语句的基本结构通常是这样的:首先写出条件,然后用一个特定的关键词(比如“if”)来表示如果条件成立,接着在大括号里写出要执行的代码。如果条件不成立,可以用“else”来表示要执行的另一段代码。

举个简单的例子:假设你想检查一个数字是否大于10。如果是,就打印“这个数字大于10”;如果不是,就打印“这个数字小于或等于10”。这个过程就是通过条件语句来实现的。

在编程中,条件语句非常常见,因为它们帮助我们根据不同的情况做出不同的反应。

for line in hosts:
        print line.split()[1:]

撰写回答