3

我有一个使用 AWS 开发工具包 (PHP) 的 cronjob 来更新 /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 等)的列表。有人可以帮我吗?

4

3 回答 3

6
for line in hosts:
        print line.split()[1:]
于 2013-03-21T21:10:31.847 回答
6

我知道这个问题已经过时并且在技术上已解决,但我只是想我会提到(现在)有一个库可以读取(和写入)主机文件: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% 的测试覆盖率。

于 2017-03-24T10:10:17.843 回答
2

这应该返回所有主机名,并且也应该处理内联注释。

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
于 2018-02-21T23:58:21.273 回答