如何在Perl中输出DNS解析错误?

时间:2010-09-29 07:29:57

标签: perl dns

我目前有一个DNS反向查找脚本,但是有一个小问题,该脚本能够输出DNS系统错误。

问题是这样的:

  1. 虚假/错误的互联网地址名称中的用户密钥等。“www.whyisthednsnothappening.com”
  2. 然后,脚本将使用system(clear)
  3. 清除屏幕
  4. 然后脚本将打印“无法解析DNS。错误是由于:各种系统错误
  5. 脚本会将用户重新定向回相同的菜单/脚本以再次输入名称地址。
  6. 所以现在的主要问题是步骤3,脚本只显示“无法解析DNS。错误是由于: BLANK ”假设 BLANK 显示错误,如“Socket :: inet_ntoa的错误arg长度,长度为0,应该是./showdns.pl第28行,<>第1行”。并且DNS脚本的菜单位于错误打印的下方。

    代码:

    #!/usr/bin/perl
    
    use IO::Socket;
    use warnings;
    use strict;
    use Term::ANSIColor;
    use Socket;
    use Sys::Hostname;
    
    print "\nYou are now in Show DNS IP Address!\n\n";
    
    print "*************\n";
    print "|DNS Address|\n";
    print "*************\n";
    
    print "\nPlease enter a hostname that you wish to view\n\n";
    print "\n\nEnter the hostname of Choice Here: ";
    my $userchoice =  <>;
    chomp ($userchoice);
    
    my $hostname = $userchoice;
    
    my $i_addr = scalar(gethostbyname($hostname || 'localhost'));
    if ( ! defined $i_addr ) {
    my $err = $!;
    my $herr = int herror(const char *s);
    system('clear');
    print("Can't resolve $hostname: $herr, try again");
    exec("/root/Desktop/showdns.pl");
    exit();
    }
    
    my $name = inet_ntoa($i_addr);
    my $coloredText = colored($name, 'bold underline blue');
    print "\n\nThe hostname IP address is: $coloredText\n\n";
    
    print "Press enter to go back to the main menu\n\n";
    my $userinput2 =  <>;
    chomp ($userinput2);
    
    system("clear");
    system("/root/Desktop/simpleip.pl");
    

    有人可以就代码提出建议吗?谢谢!

3 个答案:

答案 0 :(得分:2)

啊,我明白你的意思了。系统(“清除”)调用正在清除$!在你有机会从gethostbyname打印错误之前变量。

my $i_addr = scalar(gethostbyname($hostname || 'localhost'));
if ( ! defined $i_addr ) {
    my $err = $!;
    system("clear");
    print("Can't resolve $hostname: $err, try again");
    system("/root/Desktop/showdns.pl");
    exit();
}

虽然据我所知,gethostbyname返回的特定错误不是很有意义。

您可能希望考虑在脚本中放置一个循环,而不是让它重新开始使用system()。如果出现故障,你肯定不想继续使用inet_ntoa。请注意,inet_ntoa与DNS查找没有任何关系;这是由gethostbyname完成的。 inet_ntoa只是将一个4字节的字符串更改为正常的123.123.123.123 可打印的ipaddress形式。 sprintf("%vd", $i_addr)做同样的事情。

答案 1 :(得分:0)

另外两个问题:

  1. 如果您将通话移除 system('clear')错误 从gethostbyname得到显示 然后

  2. 你为什么用? system('/root/Desktop/showdns.pl') 要递归调用相同的脚本? 使用exec不是更好吗 而不是systemexec终止 目前的过程。而system 一个完整的新过程的分叉和 等待该进程退出。所以 如果您的用户输入,例如,20 无效的主机名,你最终会 有20个进程等待 最近的那个 创建

  3. GR, LDX

答案 2 :(得分:-2)

请检查以下内容以解决perl脚本中的上述“dns”问题。

由于DNS服务器未运行,perl将无法解析该地址。所以它返回一个空字符串,inet_ntoa将为该空字符串抛出错误。

如果您使用的是Linux系统,请验证以下内容:

a)检查文件/etc/resolv.conf

中的互联网地址
nameserver 172.19.1.11  (IP address of your internet or survice provider)

b)在/etc/nsswitch.conf文件中添加“dns”,如下所示:

hosts:      files dns