Linux getent命令介绍
getent是一个英文单词的缩写,全称是get entries,意思是获取条目。这个命令可以从Name Service Switch库中获取各种数据库的条目,这些数据库都是一些重要的文本文件,存储了用户、组、主机、服务等信息。getent命令可以查询本地或网络上的数据库,比如LDAP,这取决于/etc/nsswitch.conf文件中的配置。getent命令可以帮助我们查看和验证系统中的用户、组和其他信息,也可以用来测试Name Service Switch的配置是否正确。
Linux getent命令适用的Linux版本
getent命令是GNU C库提供的一个标准命令,所以它可以在大多数Linux发行版中使用,比如Ubuntu, Debian, Fedora, CentOS等。如果你的系统中没有安装getent命令,你可以使用以下命令来安装:
[linux@bashcommandnotfound.cn ~]$ sudo apt-get install libc-bin # Ubuntu, Debian
[linux@bashcommandnotfound.cn ~]$ sudo yum install glibc-common # CentOS 7
[linux@bashcommandnotfound.cn ~]$ sudo dnf install glibc-common # CentOS 8, Fedora
Linux getent命令的基本语法
getent命令的基本语法格式如下:
getent [选项]... 数据库 [键]...
其中,数据库是要查询的数据库的名称,可以是以下之一:
- ahosts: 查询主机地址和名称的数据库,使用getaddrinfo(3)函数。
- ahostsv4: 同上,但只查询IPv4地址。
- ahostsv6: 同上,但只查询IPv6地址。
- aliases: 查询邮件别名的数据库,使用getaliasbyname(3)函数。
- ethers: 查询以太网地址和主机名的数据库,使用ether_aton(3)和ether_hostton(3)函数。
- group: 查询用户组的数据库,使用getgrgid(3)和getgrnam(3)函数。
- gshadow: 查询用户组密码的数据库,使用getsgnam(3)函数。
- hosts: 查询主机地址和名称的数据库,使用gethostbyaddr(3)和gethostbyname2(3)函数。
- initgroups: 查询用户所属的所有用户组,使用getgrouplist(3)函数。
- netgroup: 查询网络组的数据库,使用getnetgrent(3)和innetgr(3)函数。
- networks: 查询网络名称和编号的数据库,使用getnetbyaddr(3)和getnetbyname(3)函数。
- passwd: 查询用户账户的数据库,使用getpwuid(3)和getpwnam(3)函数。
- protocols: 查询网络协议的数据库,使用getprotobyname(3)和getprotobynumber(3)函数。
- rpc: 查询远程过程调用的数据库,使用getrpcbyname(3)和getrpcbynumber(3)函数。
- services: 查询网络服务的数据库,使用getservbyname(3)和getservbyport(3)函数。
- shadow: 查询用户密码的数据库,使用getspnam(3)函数。
键是要查询的具体的值,比如用户的名称或ID,主机的地址或名称,服务的端口或名称等。如果不指定键,那么会显示数据库中的所有条目,除非数据库不支持枚举。
选项是一些可选的参数,用来修改命令的行为,可以是以下之一:
- -s service, --service service: 使用指定的服务来覆盖所有的数据库的查询,服务可以是files, db, dns, nis, nisplus, ldap等。
- -s database:service, --service database:service: 使用指定的服务来覆盖指定的数据库的查询,可以多次使用这个选项,但每个数据库只会使用最后一个服务。
- -i, --no-idn: 禁用IDN编码,在查询ahosts/getaddrinfo(3)时使用。
- -?, --help: 显示命令的用法和帮助信息,并退出。
- --usage: 显示命令的简短用法,并退出。
- -V, --version: 显示命令的版本号,许可证和免责声明,并退出。
Linux getent命令的常用选项或参数说明
getent命令的常用选项或参数如下表所示:
选项 | 参数 | 说明 |
---|---|---|
-s | service | 使用指定的服务来覆盖所有的数据库的查询 |
-s | database:service | 使用指定的服务来覆盖指定的数据库的查询 |
-i | 无 | 禁用IDN编码,在查询ahosts/getaddrinfo(3)时使用 |
-? | 无 | 显示命令的用法和帮助信息,并退出 |
--usage | 无 | 显示命令的简短用法,并退出 |
-V | 无 | 显示命令的版本号,许可证和免责声明,并退出 |
Linux getent命令的实例
下面是一些使用getent命令的实例,可以帮助你更好地理解和使用这个命令。
实例1:查询用户账户的数据库
如果不指定键,那么会显示系统中所有的用户账户的信息,包括用户名,密码,用户ID,组ID,注释,主目录和登录shell。这些信息和/etc/passwd文件中的内容一致,但可能还包括网络上的用户账户。
[linux@bashcommandnotfound.cn ~]$ getent passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
...
如果指定一个或多个键,那么只会显示匹配的用户账户的信息,键可以是用户名或用户ID。
[linux@bashcommandnotfound.cn ~]$ getent passwd root 1000
root:x:0:0:root:/root:/bin/bash
linux:x:1000:1000:linux,,,:/home/linux:/bin/bash
实例2:查询用户组的数据库
如果不指定键,那么会显示系统中所有的用户组的信息,包括组名,密码,组ID和组成员。这些信息和/etc/group文件中的内容一致,但可能还包括网络上的用户组。
[linux@bashcommandnotfound.cn ~]$ getent group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog,linux
...
如果指定一个或多个键,那么只会显示匹配的用户组的信息,键可以是组名或组ID。
[linux@bashcommandnotfound.cn ~]$ getent group sudo 1000
sudo:x:27:linux
linux:x:1000:
实例3:查询主机地址和名称的数据库
如果不指定键,那么会显示系统中所有的主机地址和名称的信息,包括IPv4和IPv6地址,以及主机名和别名。这些信息和/etc/hosts文件中的内容一致,但可能还包括DNS或其他网络服务提供的信息。
[linux@bashcommandnotfound.cn ~]$ getent hosts
127.0.0.1 localhost
127.0.1.1 linux
::1 localhost ip6-localhost ip6-loopback
...
实例4:查询主机地址和名称的数据库(指定服务)
如果我们想要指定一个服务来查询主机地址和名称的数据库,比如只使用DNS,那么我们可以使用-s选项来覆盖默认的服务。这样,我们可以比较不同的服务返回的结果是否一致,或者测试某个服务是否可用。
[linux@bashcommandnotfound.cn ~]$ getent hosts www.bing.com
13.107.21.200 www.bing.com
13.107.213.200 www.bing.com
[linux@bashcommandnotfound.cn ~]$ getent -s dns hosts www.bing.com
13.107.21.200 www.bing.com
13.107.213.200 www.bing.com
[linux@bashcommandnotfound.cn ~]$ getent -s files hosts www.bing.com
# 没有输出,表示/etc/hosts文件中没有www.bing.com的条目
实例5:查询网络服务的数据库
如果不指定键,那么会显示系统中所有的网络服务的信息,包括服务名,别名,端口号和协议。这些信息和/etc/services文件中的内容一致,但可能还包括其他网络服务提供的信息。
[linux@bashcommandnotfound.cn ~]$ getent services
tcpmux 1/tcp # TCP port service multiplexer
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
systat 11/tcp users
daytime 13/tcp
daytime 13/udp
...
如果指定一个或多个键,那么只会显示匹配的网络服务的信息,键可以是服务名,别名,端口号或端口号/协议的组合。
[linux@bashcommandnotfound.cn ~]$ getent services ssh 80 443/tcp
ssh 22/tcp
http 80/tcp www www-http
https 443/tcp # http protocol over TLS/SSL
实例6:查询网络协议的数据库
如果不指定键,那么会显示系统中所有的网络协议的信息,包括协议名,别名和编号。这些信息和/etc/protocols文件中的内容一致,但可能还包括其他网络服务提供的信息。
[linux@bashcommandnotfound.cn ~]$ getent protocols
ip 0 IP # internet protocol, pseudo protocol number
hopopt 0 HOPOPT # IPv6 Hop-by-Hop Option [RFC1883]
icmp 1 ICMP # internet control message protocol
igmp 2 IGMP # internet group management protocol
ggp 3 GGP # gateway-gateway protocol
...
如果指定一个或多个键,那么只会显示匹配的网络协议的信息,键可以是协议名,别名或编号。
[linux@bashcommandnotfound.cn ~]$ getent protocols tcp udp 50
tcp 6 TCP # transmission control protocol
udp 17 UDP # user datagram protocol
esp 50 IPSEC-ESP # Encap Security Payload [RFC2406]
实例7:查询网络名称和编号的数据库
如果不指定键,那么会显示系统中所有的网络名称和编号的信息,包括网络名,别名和编号。这些信息和/etc/networks文件中的内容一致,但可能还包括其他网络服务提供的信息。
[linux@bashcommandnotfound.cn ~]$ getent networks
default 0.0.0.0
loopback 127.0.0.0
link-local 169.254.0.0
如果指定一个或多个键,那么只会显示匹配的网络名称和编号的信息,键可以是网络名,别名或编号。
[linux@bashcommandnotfound.cn ~]$ getent networks loopback 0.0.0.0
loopback 127.0.0.0
default 0.0.0.0
实例8:查询邮件别名的数据库
如果不指定键,那么会显示系统中所有的邮件别名的信息,包括别名和对应的邮件地址。这些信息和/etc/aliases文件中的内容一致,但可能还包括其他网络服务提供的信息。
[linux@bashcommandnotfound.cn ~]$ getent aliases
mailer-daemon: postmaster
postmaster: root
nobody: root
hostmaster: root
usenet: root
...
如果指定一个或多个键,那么只会显示匹配的邮件别名的信息,键可以是别名或邮件地址。
[linux@bashcommandnotfound.cn ~]$ getent aliases root nobody
postmaster: root
nobody: root
实例9:查询以太网地址和主机名的数据库
如果不指定键,那么会显示系统中所有的以太网地址和主机名的信息,包括以太网地址和对应的主机名。这些信息和/etc/ethers文件中的内容一致,但可能还包括其他网络服务提供的信息。
[linux@bashcommandnotfound.cn ~]$ getent ethers
08:00:27:9b:9c:9c linux
08:00:27:9b:9c:9d centos
08:00:27:9b:9c:9e ubuntu
如果指定一个或多个键,那么只会显示匹配的以太网地址和主机名的信息,键可以是以太网地址或主机名。
[linux@bashcommandnotfound.cn ~]$ getent ethers linux 08:00:27:9b:9c:9e
08:00:27:9b:9c:9c linux
08:00:27:9b:9c:9e ubuntu
实例10:查询远程过程调用的数据库
如果不指定键,那么会显示系统中所有的远程过程调用的信息,包括调用名,别名和编号。这些信息和/etc/rpc文件中的内容一致,但可能还包括其他网络服务提供的信息。
[linux@bashcommandnotfound.cn ~]$ getent rpc
portmap 100000 portmapper sunrpc
rstatd 100001 rstat rstat_svc
rusersd 100002 rusers
nfs 100003 nfsprog
ypprog 100004 ypserv
...
如果指定一个或多个键,那么只会显示匹配的远程过程调用的信息,键可以是调用名,别名或编号。
[linux@bashcommandnotfound.cn ~]$ getent rpc nfs 100007
nfs 100003 nfsprog
ypbind 100007 ypbind
Linux getent命令的注意事项
使用getent命令时,有以下几点需要注意:
- getent命令的查询结果取决于/etc/nsswitch.conf文件中的配置,这个文件定义了各种数据库的查询顺序和服务。如果这个文件不存在或损坏,那么getent命令可能无法正常工作。
- getent命令只能查询支持枚举的数据库,比如passwd, group, hosts, services等。如果查询不支持枚举的数据库,比如netgroup, initgroups等,那么必须指定一个或多个键,否则会返回错误。
- getent命令只能查询文本文件或网络服务提供的数据库,不能查询二进制文件或数据库系统提供的数据库,比如shadow, gshadow等。如果查询这些数据库,那么会返回错误。
- 如果查询的数据库或键不存在,或者查询的服务不可用,那么getent命令会返回错误,并显示
bash: getent: command not found
的提示信息。这时,你可以检查你的输入是否正确,或者尝试安装或配置相应的服务。
Linux getent相关命令
以下是一些和getent命令相关的命令,你可以点击链接查看更多的介绍和实例。
评论区