我正在尝试使用 Putty 通过我的 PC ssh 进入我的主板(Imx6 Humming 主板)。在 Putty 中登录提示后,我立即收到“意外关闭的网络连接”提示。在根文件系统中替换这两个库,解决了这个问题。为什么这些文件会产生问题,它们对 ssh 有什么依赖?任何有关这两个库文件的帮助都将不胜感激。
答案1
libnss_files.so 是实际读取 /etc/passwd、/etc/group、/etc/hosts 的库。没有它,程序将无法查找用户名和用户 ID – OpenSSH 不会知道您的 UID 和您的主目录;事实上,它不会知道您的存在。
类似地,libnss_dns.so 是进行 DNS 查询的库。它不是系统上唯一的 DNS 库,但它是处理大多数程序使用的通用“将域解析为地址”函数的库。
一般来说,它们是 Glibc 模块,分别处理来自 DNS 和文件的目录信息查找。这里的“目录信息”是指 1) 用户帐户,如 /etc/passwd 或 /etc/group 中的帐户,以及 2) 主机名,如 DNS 或 /etc/hosts 中的帐户。(换句话说,目录是指电话簿中的目录,而不是文件夹中的目录。)
这库标准库,由用 C 编写的程序使用,具有用于查找目录信息的通用函数,无论来源如何。也就是说,实际程序不需要关心 DNS 或 /etc – 它们只需调用 libc 函数来查找用户名(或主机名、组或 TCP 端口...),然后 libc 会从任何适当的来源获取它。
Glibc 是大多数 Linux 系统上使用的 libc,它具有模块化的信息源——系统管理员可以添加新的信息源,对它们进行重新排序等等。libc“核心”不需要知道 /etc/passwd 或 /etc/hosts 的具体信息,而是将该任务委托给“libnss_files”模块——同样,有关 DNS 的知识也在“libnss_dns”模块中。
每当程序需要解析域名时,libc 就会检查 /etc/nsswitch.conf 中配置的每个模块 - 首先询问“files”模块(检查 /etc/hosts),然后询问“dns”模块(检查 DNS),直到得到答案。可能还有其他用于 mDNS(“.local”域)和 NetBIOS 等的模块。
类似地,每当程序需要将用户名解析为 UID,或将 UID 解析为用户名时,libc 都会要求“files”模块从 /etc/passwd 获取用户。(同样,可能还有其他模块,如“ldap”、“pgsql”或“nis”,它们从其他来源获取用户帐户信息。)