环顾四周,我发现了关于/etc/resolv.conf有效格式的以下内容:
但是,我在任何地方都找不到resolv.conf关键字是不区分大小写还是区分大小写。它们似乎通常是小写的,但它们必须是小写的吗?如果我发现服务器位于大写的位置,这是否是一个错误?
谷歌搜索出现了这个论坛帖子,其中一个代码示例似乎表明关键字不区分大小写。但是,没有任何权威文件的链接。
/etc/resolv.conf关键字(如nameserver)是否区分大小写?
发布于 2016-11-10 22:36:38
在glibc解析器库中,它们当然是区分大小写的。注意strncmp (区分大小写的比较)而不是strncasecmp (区分大小写的比较)在glibc区域_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
#发布于 2016-11-10 22:40:32
看看glibc的源代码,试图匹配domain和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,您将不会看到错误:这行将被忽略。
https://unix.stackexchange.com/questions/322461
复制相似问题