检查域可用性——避免前面 运行——使用通配符或正则表达式

Check domain availability -- avoiding front running -- using wildcards or regex

我可以通过 whois abc123.com 检查 个人 域的可用性。

我不知道如何检查一整套符合条件的域的可用性,例如XXX YYY.Z。其中 X 是任意 3 个相同的字母,Y 是任意 3 个相同的数字,Z 是 com、org 或 io 中的任意一个。喜欢aaa111.org

这只是一个示例案例,但您明白了 - 我想指定字符串、模式和结尾,看看可用的内容。

我可以使用 Regex 进行这种字符串匹配,但我不知道如何将其应用于 shell 脚本。

我希望能够通过数组或正则表达式输入我的匹配条件,并输出所有匹配域的列表。

whois abc.com | grep "No match" 在这里很有用,因为如果该域未注册则为空白;也许这会影响到剧本,或者类似的东西。它还将输出减少到单行,而不是 whois 默认输出的垃圾山。

如果脚本可以与 bash、zsh 或 fish 一起使用,我们将不胜感激。

您可能想知道,既然可以访问网站,为什么还要从命令行执行此操作 - 原因是您要查找的域通常在您实际搜索时就被盗用了。这是一种众所周知的现象,称为 域名前端 运行,而我今天刚发生在我身上,因此我尝试了一种本地自动化解决方案,通过注册商。

...

根据评论进行编辑:我不重视解决方案的 "whois" 方面,只是能够通过正则表达式或模式进行检查。 -- 编辑 2:"whois" 结果是避免误报所必需的;修改了答案以包括这方面。

这是一个仅在没有 SOA 记录时使用 DNS 请求和 Whois 的示例实现:

#!/usr/bin/env bash

for z in {com,org,io}; do
  for y in {0..9}; do
    for x in {a..z}; do

      # Compose domain as xxxyyy.z
      domain="$x$x$x$y$y$y.$z"

      # If domain has no SOA DNS record, chances are it is available.
      if [ -z "$(dig +keepopen +short -q "$domain" -t SOA)" ]; then

        # To be sure a domain without SOA DNS record is really available:
        # check it has no whois record either
        if ! whois "$domain" >/dev/null; then
          printf 'Domain %s is available\n' "$domain"
        else
          printf 'Domain %s has no DNS SOA but has a whois record\n' "$domain"
        fi
      else
        printf 'An SOA record exist for domain %s.\nIt may not be available.\n' "$domain"
      fi
    done
  done
done

示例第一行输出:

Domain aaa000.com has no DNS SOA but has a whois record
An SOA record exist for domain bbb000.com.
It may not be available.
An SOA record exist for domain ccc000.com.
It may not be available.
Domain ddd000.com has no DNS SOA but has a whois record
An SOA record exist for domain eee000.com.
It may not be available.
An SOA record exist for domain fff000.com.
It may not be available.
An SOA record exist for domain ggg000.com.
It may not be available.

请不要在下面这样做:

I can't figure out how to check the availability of a whole set of domains that match criteria, like XXX YYY.Z. where X is any 3 letters, Y is any 3 numbers, and Z is any of com, org, or io.

原因是:这意味着要测试 52728000 个单独域名的可用性,这是一个不切实际的请求数量,即使是 DNS 服务而不是 Whois 服务也是如此。

背后的算法:

  • XXX其中X为任意3个字母:26个字母→26×26×26=17576种组合
  • YYY 其中Y为任意3个数:10个数→10×10×10=1000种组合
  • Z 其中 Z 是 com、org 或 io 中的任意一个:3 个 TLD → 3 个组合

XXXYYY.Z: 17576×1000×3 → 52728000 组合

让我们用循环而不是整个 Bash 括号表达式来计算域的数量,因为它不适合仅使用括号表达式的内存:

#!/usr/bin/env bash

for Z in {com,org,io}; do
  for YYY in {0..9}{0..9}{0..9}; do
    for XXX in {a..z}{a..z}{a..z}; do
      printf '%s%s.%s\n' "$XXX" "$YYY" "$Z"
    done
  done
done

目前没有实时 public 免费服务可让您随心所欲,即使“很快”有技术解决方案,它们也可能不会 public 或不是免费的或受到严格限制。

至少有一种可能的快捷方式(使用区域文件),但您的问题不够详细以确保它适合,但请参阅下文。它可能 better/faster 比使用 DNS 更有效,具体取决于您的用例。它有优点也有缺点。

我还将讨论其他要点以正确看待问题,我的答复是通用的(适用于多个 TLD 并以多种方式)。但这不会为您提供现成的脚本供您使用,因为该网站不是书写板,而且您列出的某些特定限制的问题太大了。

我不会重复已经给出的基于 DNS 查询的解决方案,即使给出的答案可以改进(您绝对需要联系注册表名称服务器,而不是递归的!)

RDAP

先插入一个小括号:如今,特别是在 gTLD 中,RDAP 应该成为新标准。它比 whois 好得多,因为它比 HTTPSJSON,所以它允许您取回结构化数据。 它确实也包括查找和查询之间的区别,而 whois 没有(一些注册表有“域可用性检查”,比如使用 finger;有一个 IETF 协议,称为 IRIS D-CHK,但它最多只是由 2 个注册管理机构实施,并通过 UDP 进行压缩 XML,但它从未获得牵引力)。

RFC 7480 §4:

Clients use the GET method to retrieve a response body and use the
HEAD method to determine existence of data on the server.

示例:

$ curl --head https://rdap.verisign.com/com/v1/domain/whosebug.com
HTTP/1.1 200 OK
Content-Length: 2264
Content-Type: application/rdap+json
Access-Control-Allow-Origin: *
Strict-Transport-Security: max-age=15768000; includeSubDomains; preload

$ curl --head https://rdap.verisign.com/com/v1/domain/Whosebug-but-does-not-exist.com
HTTP/1.1 404 Not Found
Content-Type: application/rdap+json
Access-Control-Allow-Origin: *
Strict-Transport-Security: max-age=15768000; includeSubDomains; preload

(如果您在第一种情况下执行 GET,您将取回一个 JSON 文档,您可以使用 jq 或等效文件进行处理)。

另请注意,“部分搜索”包含在这个新协议中,请参阅 4.1. Partial String Searching。这是一个非常简单的案例,而不是正则表达式:您可以只使用通配符。当然,注册表 RDAP 服务器没有强制执行它。

其他工作正在进行中,以获得完整的“正则表达式”搜索功能,请参阅 Registration Data Access Protocol (RDAP) Search Using POSIX Regular Expressions and to a lesser extent Registration Data Access Protocol (RDAP) Reverse search capabilities

您可以了解更多关于 RDAP 的信息:

所以即使你先用DNS再用whois的方案,我还是强烈建议你先用DNS再用RDAP。 警告:多个注册管理机构和注册商 RDAP 服务器目前 misbehaving/not 遵守规范。这将在未来得到解决,当 ICANN 合规性开始生效并且 RDAP 真正开始掩盖 whois 时。

注册商API

各种注册商都允许您访问 API,其中包括搜索可用域名 and/or 检索一些域名列表(例如:删除名称等)。 每个注册商提供什么,以及在哪些限制下当然会有所不同,因此不可能在那里回复您。但是对于任何严肃的研究来说,这将是第一站:去你喜欢的注册商那里,询问它可以提供哪些服务来帮助你。

这显然取决于注册服务商在哪些 TLD 中获得认可:获得注册管理机构认可的注册服务商有一个实时非 public 渠道 - 使用称为 EPP 的协议 - 来检查域名是否存在。

Whois 批量访问

这是存在的,但在大多数情况下几乎不可能使用。 对于 gTLD,注册商与 ICANN 签订合同。如果你阅读 their contract 你会看到这个:

3.3.6 [..] Registrar shall provide third-party bulk access to the data subject to public access under Subsection 3.3.1 under the following terms and conditions:

3.3.6.1 Registrar shall make a complete electronic copy of the data available at least one (1) time per week for download by third parties who have entered into a bulk access agreement with Registrar.

3.3.6.2 Registrar may charge an annual fee, not to exceed US,000, for such bulk access to the data.

因此,理论上,您可以访问每个注册商并要求其提供“批量 whois 访问”,这或多或少意味着完整的数据转储,但是:

  • 正如上面的合同所写,它可能会很昂贵(有 1000 多个注册商,并且由于您无法提前知道域名的注册位置,因此您需要获得所有这些)
  • 数据不会是新鲜的
  • 至于下面的区域文件,它不是实时的query/reply,您需要下载所有数据,存储它,处理它并使用它。

区域文件 (gTLD)

由于后面解释的原因,这主要适用于 gTLD,但请参阅下一节了解其他情况。

这不允许您进行实时查询,因为您需要下载数据(如果您想要新鲜的话,每天一次),将其存储在您的基础架构中的某个位置,并以与您的查询相关的格式存储之后需要做的事情(RDBMS 可能不是这里最好的存储)。

但这是对您的问题“最简单”和最广泛的解决方案。

根据与 ICANN 签订的合同,所有 gTLD 注册管理机构都必须免费提供对其区域文件的访问权限。区域文件将包含给定 TLD 下的所有已发布域名。这是所有已注册名称的子集(很难说有多少,但在个位数百分比的范围内,即使是这样),因为您可以在没有名称服务器的情况下注册域名(因此不会发布)或者域可以由于各种原因被“搁置”,因此从区域文件中消失。因此,您将获得与使用实时 DNS 查询时相同数量的假阴性:您将无法获得某些域的数据(实际上是 NXDOMAIN),但实际上它们已注册(因此无法再次注册)。

所以一切从这里开始:https://www.icann.org/resources/pages/czds-2014-03-03-en 以及用户帮助部分:https://czds.icann.org/help

您需要创建一个帐户,签署一份合同,概述您可以和不可以使用这些数据做什么,然后您就可以下载每个 TLD 的每日区域文件。大多数(如果不是全部)gTLD 都将其区域文件放在那里。它可能存在一些不同的做法,因此您需要搜索。

区域文件将采用 DNS“主区域文件”格式。所以你会在其中看到 DNS 记录。您只需处理“NS”一个,您将看到所有域名。您需要确保对它们进行规范化(大小写、最后一个点等),因为内容可能因文件而异。

有了每日域名列表后,您可以在其中应用您想要搜索的任何工具,包括正则表达式。但是,请注意您可以创建的 CPU 和 RAM 约束,具体取决于您存储数据的方式。例如,原始 .com 区域文件为 13GB。

与实时 DNS 查询相比,最大的缺点是它不是实时的(数据可能长达 24 小时),您需要下载文件才能做任何您想做的事情,但最大的好处是您在本地拥有“所有”域的列表,因此您可以使用更强大的工具在其中进行搜索。

区域文件(非 gTLD)

在 gTLD 之外,即在 ccTLD 中,很少有可用的完整区域文件,因为许多 ccTLD 运营商认为它是专有的或 publicly 可识别的数据,并且没有人有合法的业务来获得它,因此它不可用。

但是有反例:

PS:创造性地使用搜索引擎(例如参见 [​​=15=] 修饰符)也有帮助;当然他们只看到现有的网站和域名完全可以注册但没有网站解析。