python - 从每行的/etc/hosts中获取主机名值
我有一个定时任务,它使用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:]