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 from daemon.c 并使用此常量使与 gethostname(2) 一起使用的所有缓冲区足够大以应对任何可能的结果 和一个终止的NUL

【讨论】:

以上是关于Unix 中主机名的最大字符数是多少?的主要内容,如果未能解决你的问题,请参考以下文章

HSQL DB 中表名的最大大小是多少?

Ubuntu查看并修改主机名的方法#私藏项目实操分享#

Oracle中表名的最大长度是多少?

从 URL 获取域名/主机名的最快方法是啥?

Linux主机名的设置

CentOS7主机名的查看和修改