我想知道Unix系统中主机名的最大字符数是多少。另外,是否有任何可以在Unix编程中使用的定义变量来调用该数字? (即主机名允许的字符数)。
我在C编程。
答案 0 :(得分:59)
您通常可以输入:
getconf HOST_NAME_MAX
此外,您通常可以在应用程序中包含limits.h并读取define的值。
虽然POSIX标准保证不会超过255个字节,但这并不一定意味着每个实现都会遵循这个标准。
在您的平台上发布gethostname以获取更详细的信息。
答案 1 :(得分:49)
<强> TL;博士强>:
代码应该处理长达255个字节的主机名; 管理员应保持主机名长度(不包括域)在19字节以内, 和域名长度(不包括主机名)在23个字节以内。
host.example.com
),在这种情况下:
.
及其后的任何内容)
最多只能 63 字节.
个字符之间的部分)
从上述所有限制中,减去额外的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 bytes。 HOST_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 5781a9a见David Turner (csusbdt
)(2017年4月18日)
(由David Turner -- csusbdt
--合并于commit 5781a9a,2017年4月19日)
使用
的缓冲区大小\0
调整gethostname(2)
HOST_NAME_MAX
将主机名的长度限制为POSIX
导出fallback definition fromdaemon.c
并使用此常量使所有与gethostname(2)一起使用的缓冲区足够大,以便获得任何可能的结果 和终止HOST_NAME_MAX
。