在各种 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
因此速度较慢,因为每次查找都必须遍历所有数据库。