环顾四周,我发现了以下有关/etc/resolv.conf
有效格式的信息:
- 允许尾随空格
- 不允许出现前导空格
- DNS 记录不区分大小写,但您在小写所有内容的应用程序中可能会出现奇怪的问题
但是,我无法在任何地方找到是否resolv.conf
关键词不区分大小写或区分大小写。它们似乎都是小写的通常,但它们必须如此吗?如果我找到它们是大写的服务器,这是一个错误吗?
谷歌搜索出现这个论坛主题,其中代码示例似乎表明关键字是 case在敏感的。但是,没有任何权威文档的链接。
/etc/resolv.conf
关键字(例如)是否nameserver
区分大小写?
答案1
它们在 glibc 解析器库中当然是区分大小写的。请注意在 MATCH 函数中使用strncmp
(区分大小写的比较) 而不是(不区分大小写的比较)strncasecmp
glibc res_init.c。
这段代码负责读取+解析/etc/resolv.conf
文件。
#define MATCH(line, name) \
(!strncmp(line, name, sizeof(name) - 1) && \
(line[sizeof(name) - 1] == ' ' || \
line[sizeof(name) - 1] == '\t'))
if ((fp = fopen(_PATH_RESCONF, "rce")) != NULL) {
/* No threads use this stream. */
__fsetlocking (fp, FSETLOCKING_BYCALLER);
/* read the config file */
while (fgets_unlocked(buf, sizeof(buf), fp) != NULL) {
/* skip comments */
if (*buf == ';' || *buf == '#')
continue;
/* read default domain name */
if (MATCH(buf, "domain")) {
if (haveenv) /* skip if have from environ */
continue;
cp = buf + sizeof("domain") - 1;
此外,快速示例显示查找如何与 NAMESERVER 而不是名称服务器中断。
# cat /etc/resolv.conf
options timeout:2 attempts:5
; generated by /sbin/dhclient-script
search eu-west-1.compute.internal
nameserver 172.31.0.2
# getent hosts www.google.com
2a00:1450:400b:802::2004 www.google.com
# sed -i 's/nameserver/NAMESERVER/' /etc/resolv.conf
# getent hosts www.google.com
#
答案2
看着glibc 的源代码domain
,尝试匹配像and 这样的字符串的宏nameserver
是——
#define MATCH(line, name) \
(!strncmp(line, name, sizeof(name) - 1) && \
(line[sizeof(name) - 1] == ' ' || \
line[sizeof(name) - 1] == '\t'))
与关键字匹配的行search
看起来像 -
if (MATCH(buf, "search")) {
strncmp()
区分大小写,因此该行仅匹配小写字母search
(后跟空格或制表符)。其他关键词也是同样的道理。
SEARCH
解析代码会忽略不匹配的行,因此如果您不小心使用而不是search
:该行将被忽略,您将不会看到错误。