我正在编写一个简短的脚本来从各自的whois服务器查询域名 - 而在大多数情况下,虽然通过端口43的TCP连接似乎适用于大多数whois服务器,但对whois.markmonitor.com
的查询似乎失败了,出现了奇怪的错误说无效的查询。
这是我正在使用的准系统:
#!/usr/bin/perl
#whois.pl
use strict;
use IO::Socket;
my $domain_name = "google.com";
my $query_socket = new IO::Socket::INET(
PeerAddr => 'whois.iana.org',
PeerPort => 43,
Proto => 'tcp');
print $query_socket "$domain_name ";
print $query_socket "\n\r";
while(my $this_line = <$query_socket>) {
print $this_line;
}
close($query_socket);
如上所示,使用的whois服务器是whois.iana.org
;这也与whois.internic.net
一样有效。仅在whois.markmonitor.com
的情况下,出现以下错误:
$ perl whois.pl
Invalid query
有人可以帮助我更好地了解如何获得更详细的输出以检查查询中是否存在对服务器的任何错误?
作为一个额外的测试,通过telnet
的正常连接似乎正如预期的那样工作,如下所示:
$ telnet whois.markmonitor.com 43
Trying 64.124.14.21...
Connected to whois.markmonitor.com.
Escape character is '^]'.
google.com
Domain Name: google.com
Registry Domain ID: 2138514_DOMAIN_COM-VRSN
Registrar WHOIS Server: whois.markmonitor.com
Registrar URL: http://www.markmonitor.com
Updated Date: 2015-06-12T10:38:52-0700
Creation Date: 1997-09-15T00:00:00-0700
......<output truncated>......
这使我相信通过端口43与服务器的实际连接在服务器端被接受。
正如artistoex所说 - 这是因为你的域名中有一个空格。将您的打印行更改为:
print {$query_socket} "$domain_name\n";
(注意 - 花括号是出于样式原因而可以省略 - 我更喜欢它们以明确这是一个文件句柄)
根据RFC3912,客户端需要在whois
协议中进行通信:“所有请求都以ASCII CR终止,然后是ASCII LF”
因此,在您的代码中,请使用"\n\r"
而不是"\r\n"
。并删除额外的空间,如其他回复中所写。
但请注意,whois
不是一个定义良好的结构化协议:不要指望所有whois服务器以相同的方式工作,也不要遵守某种标准。你会发现很多奇怪的案例......