直接读取文件 VS getent

直接读取文件 VS getent

在各种 shell 脚本中,我经常看到两种从支持的数据库获取信息的方法名称服务开关/etc/group诸如,/etc/hosts或 之类的库/etc/services。一个是getent实用程序,另一个是grep其他文本处理工具。例如:

root@fw-test:~# getent passwd root
root:x:0:0:root:/root:/bin/bash
root@fw-test:~# 


root@fw-test:~# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
root@fw-test:~# 

..或者:

root@fw-test:~# getent hosts www.blah.com
189.113.174.199 www.blah.com
root@fw-test:~# 

root@fw-test:~# host www.blah.com
www.blah.com has address 189.113.174.199
root@fw-test:~# 

在脚本中应该使用上述两种方法中的哪一种?我的意思是其中一种解决方案比另一种更优雅或更标准吗?

答案1

这很大程度上取决于您所处的特定环境的因素,但我更喜欢这种getent方法,因为它会查找外部用户以及本地用户。具体来说,它将从 LDAP 服务器查找我的环境中的 LDAP 用户,而 acat /etc/passwd或类似服务器甚至不知道我的 LDAP 服务器是否存在,更不用说其上有有效用户了。如果您的所有用户始终都是本地用户,那么getent除了“如果我们在 10 年内添加 LDAP 服务器就无需重写”之外,并没有真正给您带来什么好处。

答案2

getent方法将更加兼容并且更可取。这些文件(/etc/group、/etc/hosts、/etc/services、/etc/passwd...)并不总是位于其中/etc,根据您所使用的操作系统,它们也可能位于其他位置。getent无论如何都会找到条目(如果它在系统上)。

另外,正如 @John 所说,getent搜索所有配置的 nsswitch 数据库。即使您连接了(多个)外部源,您的用户也通过 DNS 服务器等进行身份验证或进行名称解析。getent因此速度较慢,因为每次查找都必须遍历所有数据库。

相关内容