python — получить значения имени хоста из каждой строки /etc/hosts

У меня есть cronjob, который использует AWS SDK (PHP) для обновления файла /etc/hosts, который записывает текущий частный IP-адрес EC2 вместе с понятным именем хоста для каждого сервера.

В 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

Все, что я ищу, это создать список только с именами хостов (сервер-1, сервер-2 и т. д.). Кто-нибудь может мне помочь?


person Joe    schedule 21.03.2013    source источник


Ответы (3)


Я знаю, что этот вопрос устарел и технически решен, но я просто подумал, что упомяну, что есть (сейчас) библиотека, которая будет читать (и записывать) файл 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% тестовое покрытие.

person otupman    schedule 24.03.2017

Это должно вернуть все имена хостов, а также позаботиться о встроенных комментариях.

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
person norbitwise    schedule 21.02.2018

person    schedule
comment
именно то, что мне было нужно, спасибо! приму ваш ответ, как только задержка будет сделана, спасибо! - person Joe; 22.03.2013