Unix 中主机名的最大字符数是多少?
Posted
技术标签:
【中文标题】Unix 中主机名的最大字符数是多少?【英文标题】:What is the maximum number of characters for a host-name in Unix? 【发布时间】:2012-02-02 05:47:53 【问题描述】:我想知道 Unix 系统中主机名的最大字符数是多少。此外,是否有任何已定义的变量可用于 Unix 编程来调用该号码? (即主机名允许的字符数)。
我正在用 C 编程。
【问题讨论】:
我没有对此投反对票,但 IMO 您应该将这个问题改写为更加以编程为中心。我不得不根据您的标签猜测您可能正在使用 C。 感谢您的评论。我已经更新了问题。 【参考方案1】:你通常可以输入:
getconf HOST_NAME_MAX
此外,您通常可以将limits.h 包含到您的应用程序中并读取define 的值。
虽然 POSIX 标准说保证不超过 255 个字节,但这并不一定意味着每个实现都会遵守这一点。
man gethostname 在您的平台上获取更多详细信息。
【讨论】:
感谢您的准确回答。 [+1] 在 Linux (glibc?) 上,unistd.h
是不够的,你必须包括 limits.h
。
在许多版本的 linux(例如 trusty)上,您不能设置主机名 > 64 个字符
看起来无法更新评论,但从内核 4.13 开始它是 64 :github.com/torvalds/linux/…【参考方案2】:
tl;dr:
代码应处理最长 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 个八位字节
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 个字节内(错误中的“小于”实际上应该是“不超过"),对于最大用户名长度为 8 个字节,意味着最大主机名 FQDN 长度为 31 个字节。如果最大用户名长度超过 8 个字节,则最大主机名长度会相应减少 - the modern Linux limit of 32 将给出最大 FQDN 长度 7 是不切实际的,即使对于像 bit.ly 这样的 URL 缩短服务也是如此.
OpenSSL 选择 40 作为电子邮件地址 X.509 主题替代名称的长度限制可能是为了与最短的替代名称语法 E.163-4(用于电话号码)兼容,并且很可能 TLS/SSL 实现(甚至可能包括 OpenSSL)支持使用具有更长电子邮件地址的证书。在 RFC 3280 中有一个单独的上限 (ub-emailaddress-length
) 为 128 个字节,在 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 字节 e,您会得到 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 字符,则需要相应地减少上述所有限制。
【讨论】:
【参考方案3】:根据RFC 1035,FQDN 的长度限制为 255 个字符,每个标签(由主机名中的点分隔的节点)限制为 63 个字符,因此实际上您所追求的限制为 63 个。
您可以通过在终端中运行getconf HOST_NAME_MAX
来获取此值。
【讨论】:
【参考方案4】:主机名通常为limited to 255 bytes。在<limits.h>
中定义的HOST_NAME_MAX
(或_POSIX_HOST_NAME_MAX
)将包含具体的值。
【讨论】:
它们仅限于此,但这并不意味着每个实现都会对此进行限制。您仍然需要查看它是如何在 HOST_NAME_MAX 定义中定义的。例如在我的 FreeBSD 机器上,它是 255,但在我的 linux 主机上:getconf HOST_NAME_MAX 64 [+1] 以获得清晰的答案。谢谢【参考方案5】:以下是一些将所有内容组合在一起的示例代码:
#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);
【讨论】:
【参考方案6】:Git 2.13(2017 年第二季度)说明了 C 中的名称长度限制,并提醒 POSIX 未指定缓冲区是否将以空值结尾。
它引入了一个新函数xgethostname()
,它确保缓冲区末尾始终有一个\0
。
参见David Turner (csusbdt
)commit 5781a9a(2017 年 4 月 18 日)。(由 David Turner -- csusbdt
-- 合并于 commit 5781a9a,2017 年 4 月 19 日)
使用
HOST_NAME_MAX
为 gethostname(2) 调整缓冲区大小
POSIX
将主机名长度限制为HOST_NAME_MAX
。 导出 fallback definition fromdaemon.c
并使用此常量使与 gethostname(2) 一起使用的所有缓冲区足够大以应对任何可能的结果 和一个终止的NUL
。
【讨论】:
以上是关于Unix 中主机名的最大字符数是多少?的主要内容,如果未能解决你的问题,请参考以下文章