nsswitch
nsswitch简介
nsswith:network service switch ,网络服务转换,是一个通用框架,实现名称解析。因为人们更容易记得是字符串样式的名称,而不是数字格式的。不是Nintendo switch。
例如:用户登录linux操作系统的时候,输入用户名,系统会将用户输入的用户名解析成id号,与解析库中存放的id进行比对,如果匹配,则让用户输入密码,然后解析用户的密码并比对,如果都匹配,那么用户可以登录。
解析库是什么?
解析库可以理解为存放 名称(name):字段(id)的存储。可以是文件系统的文件、关系型数据库、NIS(Network Information Service)、LDAP等。对于一个程序来说,如果要实现名称解析,就需要编写至少一个接口,与上述的几种解析库进行通信,至少一个接口是因为当解析库换掉的时候,还需要与替换后的解析库进行通信,要能够理解对方的协议,很麻烦。这时就需要一个通用框架,来实现与不同解析库的通讯。nsswitch就是这样的通用框架。通过配置文件nsswitch.conf规定了哪些服务通过哪些路径及按照什么顺序来查找特定类型的信息还可以指定某个方法奏效或失效时系统将采取什么动作。
nsswitch与各存储交互的模块
有两个位置:
/lib64/libns*
/usr/lib64/libns*
[root@master pam.d]# ls /lib64/libns* /lib64/libnsl-2.17.so /lib64/libnss_db.so /lib64/libnss_mymachines.so.2 /lib64/libnsl.so /lib64/libnss_db.so.2 /lib64/libnss_nis-2.17.so /lib64/libnsl.so.1 /lib64/libnss_dns-2.17.so /lib64/libnss_nisplus-2.17.so /lib64/libnspr4.so /lib64/libnss_dns.so /lib64/libnss_nisplus.so /lib64/libnss3.so /lib64/libnss_dns.so.2 /lib64/libnss_nisplus.so.2 /lib64/libnssckbi.so /lib64/libnss_files-2.17.so /lib64/libnss_nis.so /lib64/libnss_compat-2.17.so /lib64/libnss_files.so /lib64/libnss_nis.so.2 /lib64/libnss_compat.so /lib64/libnss_files.so.2 /lib64/libnsspem.so /lib64/libnss_compat.so.2 /lib64/libnss_hesiod-2.17.so /lib64/libnsssysinit.so /lib64/libnss_db-2.17.so /lib64/libnss_hesiod.so /lib64/libnssutil3.so /lib64/libnssdbm3.chk /lib64/libnss_hesiod.so.2 /lib64/libnssdbm3.so /lib64/libnss_myhostname.so.2 [root@master pam.d]# ls /usr/lib64/libns* /usr/lib64/libnsl-2.17.so /usr/lib64/libnss_db.so /usr/lib64/libnss_mymachines.so.2 /usr/lib64/libnsl.so /usr/lib64/libnss_db.so.2 /usr/lib64/libnss_nis-2.17.so /usr/lib64/libnsl.so.1 /usr/lib64/libnss_dns-2.17.so /usr/lib64/libnss_nisplus-2.17.so /usr/lib64/libnspr4.so /usr/lib64/libnss_dns.so /usr/lib64/libnss_nisplus.so /usr/lib64/libnss3.so /usr/lib64/libnss_dns.so.2 /usr/lib64/libnss_nisplus.so.2 /usr/lib64/libnssckbi.so /usr/lib64/libnss_files-2.17.so /usr/lib64/libnss_nis.so /usr/lib64/libnss_compat-2.17.so /usr/lib64/libnss_files.so /usr/lib64/libnss_nis.so.2 /usr/lib64/libnss_compat.so /usr/lib64/libnss_files.so.2 /usr/lib64/libnsspem.so /usr/lib64/libnss_compat.so.2 /usr/lib64/libnss_hesiod-2.17.so /usr/lib64/libnsssysinit.so /usr/lib64/libnss_db-2.17.so /usr/lib64/libnss_hesiod.so /usr/lib64/libnssutil3.so /usr/lib64/libnssdbm3.chk /usr/lib64/libnss_hesiod.so.2 /usr/lib64/libnssdbm3.so /usr/lib64/libnss_myhostname.so.2
nsswitch配置文件(/etc/nsswitch.conf)
# An example Name Service Switch config file. This file should be # sorted with the most-used services at the beginning. ## 说明了nsswitch的作用:将服务名称切换到配置文件,这个配置文件应该是将最常用的服务放在起始位置 # # The entry '[NOTFOUND=return]' means that the search for an ## 条目[NOTFOUND=return]的意思是从前一个条目没有检索到任何内容的时候就停止检索,这个的意思是找了但是没找到。 # entry should stop if the search in the previous entry turned ## 由于其他原因(服务不可用),检索失败的情况下会查找下一个条目。这个的意思是库文件存在,但根本就没有要查找的条目 # up nothing. Note that if the search failed due to some other reason # (like no NIS server responding) then the search continues with the # next entry. # # Valid entries include: ## 可用的条目 # # nisplus Use NIS+ (NIS version 3) # nis Use NIS (NIS version 2), also called YP # dns Use DNS (Domain Name Service) # files Use the local files # db Use the local database (.db) files # compat Use NIS on compat mode # hesiod Use Hesiod for user lookups # [NOTFOUND=return] Stop searching if not found so far # # To use db, put the "db" in front of "files" for entries you want to be ## 说明了检索顺序 # looked up first in the databases # # Example: #passwd: db files nisplus nis #shadow: db files nisplus nis #group: db files nisplus nis
# Example - obey only what nisplus tells us...
#services: nisplus [NOTFOUND=return] files
#networks: nisplus [NOTFOUND=return] files
#protocols: nisplus [NOTFOUND=return] files
#rpc: nisplus [NOTFOUND=return] files
#ethers: nisplus [NOTFOUND=return] files
#netmasks: nisplus [NOTFOUND=return] files
nsswitch的info项
下面的列表描述了nsswitch.conf文件控制搜索的大多数信息(Info项)的类型。
automount: |
自动挂载(/etc/auto.master和/etc/auto.misc) |
bootparams: |
无盘引导选项和其他引导选项(参见bootparam的手册页) |
ethers: |
MAC地址 |
group: |
用户所在组(/etc/group),getgrent()函数使用该文件 |
hosts: |
主机名和主机号(/etc/hosts),gethostbyname()以及类似的函数使用该文件 |
networks: |
网络名及网络号(/etc/networks),getnetent()函数使用该文件 |
passwd: |
用户口令(/etc/passwd),getpwent()函数使用该文件 |
protocols: |
网络协议(/etc/protocols),getprotoent()函数使用该文件 |
publickey: |
NIS+及NFS所使用的secure_rpc的公开密钥 |
rpc: |
远程过程调用名及调用号(/etc/rpc),getrpcbyname()及类似函数使用该文件 |
services: |
网络服务(/etc/services),getservent()函数使用该文件 |
shadow: |
映射口令信息(/etc/shadow),getspnam()函数使用该文件 |
aiases: |
邮件别名,sendmail()函数使用该文件 |
nsswitch的搜索库文件
files: |
搜索本地文件,如/etc/passwd和/etc/hosts |
nis: |
搜索NIS数据库,nis还有一个别名,即yp |
dns: |
查询DNS(只查询主机) |
compat: |
passwd、group和shadow文件中的±语法 |
compat方法:passwd、group和shadow文件中的"±"
可以在/etc/passwd、/etc/group和/etc/shadow文件中放入一些特殊的代码,(如果在nsswitch.conf文件中指定compat方法的话)让系统将本地文件和NIS映射表中的项进行合并和修改。
在这些文件中,如果在行首出现加号'+',就表示添加NIS信息;如果出现减号'-',就表示删除信息。举例来说,要想使用passwd文件中的这些代码,可以在nsswitch.conf文件中指定passwd: compat。然后系统就会按照顺序搜寻passwd文件,当它遇到以+或者 开头的行时,就会添加或者删除适当的NIS项。
虽然可以在passwd文件的末尾放置加号,在nsswitch.conf文件中指定passwd: compat,以搜索本地的passwd文件,然后再搜寻NIS映射表,但是更高效的一种方法是在nsswitch.conf文件中添加passwd: file nis而不修改passwd文件。
参考 https://blog.51cto.com/only27753/1540086?source=dra
nsswitch的查找状态和执行动作
STATUS => success | not found | unavail | tryagain ACTION => return | continue NOTFOUND:方法已经执行,但是并没有找到待搜索的值。 默认的动作是continue。 SUCCESS:方法已经执行,并且已经找到待搜索的值,没有返回错误。默认动作是return。 UNAVAIL:方法失败,原因是永久不可用。举例来说,所需的文件不可访问或者所需的服务器可能停机。默认的动作是continue。 TRYAGAIN:方法失败,原因是临时不可用。举例来说,某个文件被锁定,或者某台服务器超载。默认动作是continue。 return:返回到调用例程,带有返回值,或者不带返回值。 continue:继续执行下一个方法。任何返回值都会被下一个方法找到的值覆盖。
getent命令
[root@master pam.d]# getent --help Usage: getent [OPTION...] database [key ...] Get entries from administrative database. -i, --no-idn disable IDN encoding -s, --service=CONFIG Service configuration to be used -?, --help Give this help list --usage Give a short usage message -V, --version Print program version Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options. Supported databases: ahosts ahostsv4 ahostsv6 aliases ethers group gshadow hosts initgroups netgroup networks passwd protocols rpc services shadow
使用实例
[root@master pam.d]# getent services ssh ssh 22/tcp [root@master pam.d]# getent services mysql mysql 3306/tcp [root@master pam.d]# getent services ldap ldap 389/tcp [root@master pam.d]# getent hosts localhost ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 [root@master pam.d]# getent hosts master fe80::20c:29ff:fe3e:e431 master
linux中ping网关和dns都通,但是无法访问外网
[root@iZzm446eh1ux98Z ~]# vim /etc/nsswitch.conf shadow: files sss hosts: files dns myhostname ##将dns去掉 bootparams: files ethers: files netmasks: files networks: files protocols: files rpc: files ## 查看dns信息
[root@iZzm446eh1ux98Z ~]# cat /etc/resolv.conf # Generated by NetworkManager nameserver 100.100.2.136 nameserver 100.100.2.138
[root@iZzm446eh1ux98Z ~]# ping 100.100.2.136 PING 100.100.2.136 (100.100.2.136) 56(84) bytes of data. 64 bytes from 100.100.2.136: icmp_seq=1 ttl=64 time=2.07 ms 64 bytes from 100.100.2.136: icmp_seq=2 ttl=64 time=1.96 ms
## 查看路由表 [root@iZzm446eh1ux98Z ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.17.207.253 0.0.0.0 UG 100 0 0 eth0 172.17.192.0 0.0.0.0 255.255.240.0 U 100 0 0 eth0 [root@iZzm446eh1ux98Z ~]# ping 172.17.207.253 PING 172.17.207.253 (172.17.207.253) 56(84) bytes of data. 64 bytes from 172.17.207.253: icmp_seq=1 ttl=64 time=0.118 ms 64 bytes from 172.17.207.253: icmp_seq=2 ttl=64 time=0.080 ms ^C --- 172.17.207.253 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 36ms rtt min/avg/max/mdev = 0.080/0.099/0.118/0.019 ms [root@iZzm446eh1ux98Z ~]# ping baidu.com ping: baidu.com: Name or service not known
解决办法:
修改/etc/nsswitch.conf 将hosts中的dns加上就可以了
posted on 2020-05-10 22:59 hopeless-dream 阅读(803) 评论(0) 编辑 收藏 举报