resolv.conf 中的关键字区分大小写吗?

resolv.conf 中的关键字区分大小写吗?

环顾四周,我发现了以下有关/etc/resolv.conf有效格式的信息:

但是,我无法在任何地方找到是否resolv.conf 关键词不区分大小写或区分大小写。它们似乎都是小写的通常,但它们必须如此吗?如果我找到它们是大写的服务器,这是一个错误吗?

谷歌搜索出现这个论坛主题,其中代码示例似乎表明关键字是 case敏感的。但是,没有任何权威文档的链接。

/etc/resolv.conf关键字(例如)是否nameserver区分大小写?

答案1

它们在 glibc 解析器库中当然是区分大小写的。请注意在 MATCH 函数中使用strncmp(区分大小写的比较) 而不是(不区分大小写的比较)strncasecmpglibc 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:该行将被忽略,您将不会看到错误。

相关内容