Unix中主机名的最大字符数是多less?
我想知道在Unix系统中主机名的最大字符数是多less。 另外,是否有任何可以在Unix编程中使用的定义variables来调用这个数字? (即主机名称允许的字符数)。
我在C编程
你通常可以input:
getconf HOST_NAME_MAX
另外,你通常可以在你的应用程序中包含limits.h并读取define的值。
尽pipePOSIX标准规定保证不超过255个字节,但这并不一定意味着每个实现都会遵守这个标准。
在您的平台上获取更多详细信息的人gethostname。
tl; dr :
代码应该处理长达255个字节的主机名; pipe理员应保持主机名长度(不包括域)在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则会减less此限制)
- 如果主机名中包含非ASCII字符,则从所有上述限制中为每个非ASCII域标签(包含字符之间的部分)减去4 ,并减去额外的1-2个字节(不包括1字节的UTF-8编码开销)每个字符多2个字节)。
长版本:
正如@Michael所说,POSIX主机名通常限制在255个字节,而@zrvan指出,DNS限制了RFC 1035中每个标签的长度 – 然而,这个限制实际上是63 (在RFC 1035第2.3.1节和澄清在RFC 2181第11节 )。
当您使用将在DNS中使用的主机名作为SSL证书或电子邮件地址中的主机名时,还有其他限制。
首先,在DNS协议中表示为完全合格的域名(FQDN)长度限制为255个八比特组
“一系列标签,…由一个长度为零的标签终止……一个标签由一个长度八位字节组成,后面是表示该名称本身的八位字节数” – MSDN博客“旧新事物” (引用RFC 1035,有用的例证)
使用这些长度前缀(包括最终长度为零的标签),完全限定域名的实际限制为253个字节。
如果您的主机名也将被用作您需要TLS / SSL证书的服务器的DNS名称,则会有一个更短的限制,这会影响到您。 RFC 5280的附录A.1及其以前的RFC 3280和2459为X.509证书的不同字段指定了上限; ub-common-name-length
的ub-common-name-length
限制为64字节,对于服务器证书来说,它是服务器的完全限定域名。
如果使用OpenSSL生成电子邮件地址字段长度超过40个字节的SSL证书,则会看到以下错误:
string太长,需要less于40字节长
如果在OpenSSL生成的证书的电子邮件地址中使用主机名,那么@
和用户名也需要在40字节以内(错误中的“小于”应该是“不超过”),这对于最大用户名长度为8个字节,意味着最大主机名FQDN长度为31个字节。 如果最大用户名长度超过8个字节,则最大主机名长度会相应减less – 现代Linux限制为32时 ,FQDN的最大长度为7 ,即使对于像bit.ly这样的URL缩短服务也是不切实际的。
作为电子邮件地址X.509主题备选名称的长度限制的40的OpenSSLselect可能已经被select为与最短可能的备选名称语法E.163-4(用于电话号码)兼容,并且它是TLS / SSL实现(甚至包括OpenSSL)可能支持使用带有较长电子邮件地址的证书。 在RFC 3280中有一个128字节的单独的上限( ub-emailaddress-length
),在RFC 5280中增加到255字节; 这实际上是为了另一个遗留的X.509证书中的电子邮件地址embedded,但是如果许多实现也使用rfc822Address电子邮件IA5Strings的上限,这也不足为奇。
尽pipeOpenSSL将来可能会增加这个限制,但OpenSSL Request Tracker中没有这个问题,似乎不太可能改变。
即使您不使用TLS / SSL, 电子邮件地址的最大长度为254,也意味着传统8字节用户名限制的最大主机名FQDN长度为245字节。 或221个字节的现代最大用户名长度限制为32。
以所有这些最大值和2012年的中值.com域长度的最小值(恰巧是example.com的确切长度)为例,您将获得最大的第一个标签主机名长度为19个字节的40字节的电子邮件地址,如useruser@REALLY-GETTING-LONG.example.com
。
如果您的所有电子邮件地址都被映射到MXlogging和MTA地址重写的顶级域名,假设一个更合理的用户名/别名长度限制为16,那么您将获得最大域名长度为23个字节的40个字节电子邮件地址,如useruseruseruser@NOT-SO-LONG.EXAMPLE.COM
。
最后,非ASCII主机名需要IDN(国际化域名)编码以便与DNS一起使用; 这涉及到对每个非ASCII字符的域标签使用4个字符的xn--
前缀进行编码,并且对于每个非ASCII字符(除了由UTF-8编码产生的更大尺寸之外)扩展1-2个字节) 。 如果您的主机名具有非ASCII字符,则需要相应地减less所有上述限制。
根据RFC 1035 ,FQDN的长度限制为255个字符,并且每个标签(由主机名中的一个点分隔的节点)限制为63个字符,因此实际上您所处的限制是63。
您可以通过在terminal中运行getconf HOST_NAME_MAX
来获取此值。
主机名一般限制在255个字节 。 在<limits.h>
定义的HOST_NAME_MAX
(或_POSIX_HOST_NAME_MAX
)将包含特定的值。
以下是一些示例代码,将它们放在一起:
#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); }
Git 2.13(2017年第2季度)说明了C中的名称长度限制,并提醒POSIX不指定缓冲区是否以null结尾。
它引入了一个新的函数xgethostname()
,它确保在缓冲区末尾总是有一个\0
。
参见David Turner( csusbdt
) 提交的5781a9a (2017年4月18日) 。
(由David Turner合并- csusbdt
-于2017年4月19日的csusbdt
提交 )
使用
HOST_NAME_MAX
来为gethostname(2)
POSIX
将主机名的长度限制为HOST_NAME_MAX
。
从daemon.c
导出回退定义,并使用此常量使所有使用gethostname(2)的缓冲区足够大,以满足任何可能的结果和终止NUL
。