Unix中主机名的最大字符数是多少?

60

我想知道Unix系统中主机名的最大字符数是多少。此外,是否有任何已定义的变量可用于Unix编程,以调用该数字? (即允许主机名的字符数)。

我正在使用C语言进行编程。

6个回答

79

通常您可以输入:

getconf HOST_NAME_MAX

此外,您通常可以将limits.h包含到应用程序中,并读取定义的值。

虽然POSIX标准规定其不超过255字节,但这并不一定意味着每个实现都会遵守该标准。

在您的平台上使用man gethostname获取更详细的信息。


1
在Linux(glibc?)上,unistd.h是不够的,你必须包含limits.h - Josip Rodin
在许多版本的Linux(例如trusty)上,您无法设置超过64个字符的主机名。 - sabujp
1
似乎没有办法更新评论,但在内核4.13中是64:https://github.com/torvalds/linux/search?utf8=%E2%9C%93&q=__NEW_UTS_LEN&type= - sabujp

68

简述:

代码应处理长度最多为255个字节的主机名; 管理员应将主机名长度(不包括域名)保持在19个字节以内, 并将域名长度(不包括主机名)保持在23个字节以内。

  • 主机名可以长达255个字节(某些系统可能将其限制为64个)
  • DNS中使用的主机名可以长达253个字节, 作为完全合格的域名(FQDN=host.example.com),在这种情况下:
    • 第一个DNS标签(从主机名中删除 . 和其后的任何内容) 只能多达63个字节
    • 即使仅使用第一个标签作为Unix主机名,也适用于整个 FQDN 的253字节限制
  • 电子邮件地址中使用的主机名不应超过245个字节 (传统的8个字符用户名限制)或221个字节(最大32个字符的现代用户名长度) 作为完全合格的域名
  • 用于服务器TLS / SSL证书的主机名不应超过64个字节 作为完全合格的域名
  • 在OpenSSL生成的证书中用于电子邮件地址的主机名不应超过31个字节 (传统的8个字符用户名限制)作为完全合格的域名(用户名超过8个字符会减少此限制)
  • 如果主机名中有非ASCII字符,则从所有上述限制中减去每个非ASCII域标签( . 字符之间的部分)的4个字节,并减去1-2个字节 (不包括每个字符的UTF-8编码开销1-2个字节)。

长版本:

正如@Michael所说,POSIX主机名通常限制为255个字节,正如@zrvan指出的那样,DNS限制了RFC 1035中每个标签的长度 - 然而,该限制实际上是63(在RFC 1035第2.3.1节RFC 2181第11节中都有明确说明)。

当您使用将用于DNS的主机名时,还会出现其他限制,例如SSL证书或电子邮件地址中的主机名。

首先,在DNS协议中表示的完全限定域名(FQDN)长度限制为255个八位字节,表示为

"一系列标签,...以长度为零的标签终止。...一个标签由一个长度八位字节和表示名称本身的该数量的八位字节组成"

包括最后长度为零的标签在内,使用这些长度前缀,完全限定域名的实际限制为253个字节。

如果您的主机名也将用作需要TLS/SSL证书的服务器的DNS名称,则会影响您的一个更短的限制。 RFC 5280及其前身RFC 3280和2459的附录A.1指定了X.509证书不同字段的上限;对于服务器证书而言,Common Name字段的ub-common-name-length限制是服务器的完全限定域名,其限制为64个字节。

如果您使用OpenSSL生成具有超过40个字节长的电子邮件地址字段的SSL证书,则会看到此错误:

字符串太长,需要少于40个字节

如果主机名将用于OpenSSL生成的证书的电子邮件地址中,则“@”和用户名也需要在40个字节内(错误信息中的“less than”实际上应该是“no more than”),对于最大用户名长度为8个字节,意味着最大主机名FQDN长度为31个字节。如果最大用户名长度超过8个字节,则相应地减小最大主机名长度 - 现代Linux的限制为32将给出一个不切实际的最大FQDN长度为7,即使对于像bit.ly这样的URL缩短服务也是如此。

OpenSSL选择将电子邮件地址X.509主体替代名称的长度限制设为40,可能是为了与最短的替代名称语法E.163-4(用于电话号码)兼容,并且很可能TLS/SSL实现(甚至包括OpenSSL)支持使用具有更长电子邮件地址的证书。RFC 3280中有一个单独的上限(ub-emailaddress-length)为128字节,RFC 5280中增加到255字节;这实际上是针对另一种在X.509证书中嵌入电子邮件地址的遗留方法,但许多实现很可能也会将该上限用于rfc822Address电子邮件IA5Strings。

虽然OpenSSL未来可以增加此限制,但OpenSSL请求跟踪器没有任何问题,并且似乎不太可能更改。

即使您不使用TLS / SSL,最大电子邮件地址长度为254意味着传统8字节用户名限制的最大主机名FQDN长度为245字节;或32个现代最大用户名长度限制的221字节。取所有这些最大值的最小值和2012年中位数.com域名长度为11(巧合的是example.com的确切长度),则对于像useruser@REALLY-GETTING-LONG.example.com这样的40字节电子邮件地址,第一个标签主机名的最大长度为19字节。如果您的所有电子邮件地址都映射到具有MX记录和MTA地址重写的顶级域名,假设用户名/别名长度限制更合理为16,则对于像useruseruseruser@NOT-SO-LONG.EXAMPLE.COM这样的40字节电子邮件地址,您将获得最大的域名长度为23字节。
最后,非ASCII主机名需要使用IDN(国际化域名)编码才能与DNS一起使用;这涉及到每个带有非ASCII字符的域标签的4个字符前缀xn--的编码,以及每个非ASCII字符的1-2字节扩展(除了由于UTF-8编码而导致的较大大小)。如果您的主机名包含非ASCII字符,则需要相应地减少上述所有限制。

21

根据RFC 1035规定,完全限定域名(FQDN)的长度限制为255个字符,每个标签(由主机名中的点分隔的节点)的长度限制为63个字符,因此实际上你需要的限制是63个字符。

您可以在终端中运行getconf HOST_NAME_MAX来获取此值。


13

主机名通常限制为255个字节。在<limits.h>中定义了HOST_NAME_MAX(或_POSIX_HOST_NAME_MAX)以包含具体值。


4
它们被限制在那个上面,但这并不意味着每个实现都会将其限制在那个上面。你仍然需要查看HOST_NAME_MAX定义的方式。例如,在我的FreeBSD机器上,它是255,但在我的Linux主机上,它是64(通过运行命令:getconf HOST_NAME_MAX)。 - Michael

3
这里有一些将所有内容结合起来的示例代码:
#include <limits.h>
#include <unistd.h>
#include <stdio.h>

char host[HOST_NAME_MAX + 1];

host[HOST_NAME_MAX] = 0;

if (gethostname(host, sizeof(host) - 1) == 0)
{
    printf("hostname is %s\n", host);
}

0

Git 2.13 (Q2 2017) 表明 C 中的名称长度限制,并提醒 POSIX 没有指定缓冲区是否以 null 结尾。
它引入了一个新函数 xgethostname(),确保缓冲区末尾始终有一个 \0

请参见 commit 5781a9a(由 David Turner (csusbdt) 于 2017 年 4 月 18 日提交)
(由 David Turner -- csusbdt -- 合并于 commit 5781a9a,2017 年 4 月 19 日)

使用HOST_NAME_MAX设置gethostname(2)缓冲区大小

POSIX将主机名的长度限制为HOST_NAME_MAX
daemon.c中导出备用定义并使用此常量使得与gethostname(2)一起使用的所有缓冲区都足够大以容纳任何可能的结果和终止符NUL


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接