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

时间:2012-01-04 10:00:18

标签: c unix max hostname

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

我在C编程。

6 个答案:

答案 0 :(得分:59)

您通常可以输入:

getconf HOST_NAME_MAX

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

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

在您的平台上发布gethostname以获取更详细的信息。

答案 1 :(得分:49)

<强> TL;博士

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

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

长版:

正如@Michael所说,POSIX主机名通常限制为255个字节,正如@zrvan指出的那样,DNS限制RFC 1035中每个标签的长度 - 但是,该限制实际上是 63 (均在RFC 1035 section 2.3.1中,并在RFC 2181 section 11中澄清)。

当您使用将在DNS中使用的主机名作为SSL证书或电子邮件地址中的主机名时,还有其他限制。

首先,当在DNS协议中表示为

时,完全限定的域名(FQDN)长度限制为255个八位字节。
  

&#34;一系列标签,......以长度为零的标签终止。 ...标签由一个长度八位字节组成,后跟表示名称本身的八位字节数&#34;    - MSDN Blog "The Old New Thing"(引用RFC 1035,有用说明)

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

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

如果您使用OpenSSL生成一个长度超过40个字节的电子邮件地址字段的SSL证书,您将看到以下错误:

  

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

如果主机名将用于OpenSSL生成的证书的电子邮件地址,则@和用户名也需要在40个字节内(&#34;小于&#34;在错误中)应该真的是&#34;不超过&#34;),对于最大用户名长度为8个字节,意味着最大主机名FQDN长度 31 字节。如果最大用户名长度超过8个字节,则相应地减少最大主机名长度 - the modern Linux limit of 32将给出 7 的最大FQDN长度,这是不切实际的,即使对于像bit这样的URL缩短服务也是如此.ly。

可选择40的OpenSSL选项作为电子邮件地址X.509主题备用名称的长度限制,以便与最短的备用名称语法E.163-4(电话号码)兼容,并且TLS / SSL实现(可能甚至包括OpenSSL)可能支持使用具有更长电子邮件地址的证书。 RFC 3280中有128个字节的单独上限(ub-emailaddress-length),RFC 5280中增加到255个字节;这实际上是另一个传统的X.509证书中的电子邮件地址嵌入,但如果许多实现也使用rfc822Address电子邮件IA5Strings的上限,也就不足为奇了。

虽然OpenSSL将来可能会增加此限制,但OpenSSL Request Tracker中没有问题,而且似乎不太可能改变。

即使您不使用TLS / SSL,maximum e-mail address length of 254也意味着传统的8字节用户名限制的最大主机名FQDN长度 245 字节;或 221 字节,现代最大用户名长度限制为32。

取所有这些最大值和2012 median .com domain length of 11的最小值(巧合地是example.com的确切长度),并获得40的最大第一个标签主机名长度 19 字节字节的电子邮件地址就像 useruser@REALLY-GETTING-LONG.example.com

如果您的所有电子邮件地址都映射到具有MX记录和MTA地址重写的顶级域名,假设更合理的用户名/别名长度限制为16,则您获得的最大域名长度为 23 字节,用于40字节的电子邮件地址,如useruseruseruser@NOT-SO-LONG.EXAMPLE.COM

最后,非ASCII主机名需要IDN(国际化域名)编码 用于DNS;这涉及每个带有非ASCII字符的域标签的4个字符xn--前缀的编码,以及每个非ASCII字符的1-2个字节的扩展(除了UTF-8产生的更大的大小)编码)。如果您的主机名具有非ASCII字符,则需要相应地减少所有上述限制。

答案 2 :(得分:18)

根据RFC 1035,FQDN的长度限制为255个字符,并且每个标签(由主机名中的点分隔的节点)限制为63个字符,因此实际上您所遵循的限制是63。

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

答案 3 :(得分:12)

主机名通常为limited to 255 bytesHOST_NAME_MAX中定义的_POSIX_HOST_NAME_MAX(或<limits.h>)将包含特定值。

答案 4 :(得分:2)

以下是一些将所有内容放在一起的示例代码:

#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);
}

答案 5 :(得分:0)

Git 2.13(2017年第2季度)说明了C中的名称长度限制,并提醒POSIX没有指定缓冲区是否以空值终止。
它引入了一个新函数r1: x1 + x2 + x3 <= 1.0 r2: x2 - 3 x5 = 2.0 r3: x7 + x8 = 10.0 ,它确保缓冲区末尾始终有xgethostname()

commit 5781a9aDavid Turner (csusbdt)(2017年4月18日) (由David Turner -- csusbdt --合并于commit 5781a9a,2017年4月19日)

  

使用\0调整gethostname(2)

的缓冲区大小      

HOST_NAME_MAX将主机名的长度限制为POSIX   导出fallback definition from daemon.c并使用此常量使所有与gethostname(2)一起使用的缓冲区足够大,以便获得任何可能的结果   和终止HOST_NAME_MAX