2010-09-29 42 views
-3

我目前有一个DNS反向查找脚本,可以工作,但是有一个小小的问题可以输出DNS系统错误。如何在Perl中为DNS解析输出错误?

的问题是这样的:假/错的互联网地址名称等。“www.whyisthednsnothappening.com”

    1. 用户按键脚本将然后使用系统清除屏幕(清)
    2. 脚本然后将打印“无法解析DNS的错误是由于:各种系统错误
    3. 脚本重新引导用户回到同一菜单/脚本的名称地址,再次输入。

    所以主要问题是现在第3步该脚本只显示我“无法解析DNS的错误是由于:BLANK”哪个BLANK是假设显示像“坏ARG错误长度为Socket :: inet_ntoa,长度为0,应为4,位于./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"); 
    

    可有人请给出代码的建议吗?谢谢!

  • +0

    的[?我该如何配置使用Perl“检查错误”的DNS查询]可能重复(http://stackoverflow.com/questions/3801705/how-can-i-配置检查用于错误的Dns-lookup-using-perl) – 2010-09-29 15:36:50

    +0

    阅读到评论的最后!而布莱恩没有进攻,但你的表现就像一个跟踪者,如果你停止跟踪我,他会非常感激...... – JavaNoob 2010-09-30 00:56:47

    回答

    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字节的字符串更改为ipaddress的可打印格式的普通123.123.123.123 。 sprintf("%vd", $i_addr)做同样的事情。

    +0

    gethostbyname的错误仍然无法看到。同样的消息,如“无法解析www.thisisverywierd.com:,再试一次”,在重定向回脚本时出现没有错误。这一次,我退出脚本后甚至没有出现错误...这是越来越棘手... – JavaNoob 2010-09-29 08:18:03

    +0

    好吧,我缩小了错误,但我仍然无法解决它,所以请建议。现在的主要错误是由于“系统(”清除“)的类型;”用于清除屏幕。是否有任何其他类型的屏幕清除允许系统不清除其缓冲区缓存?我尝试了几乎所有的屏幕清理方法,但缓存仍然清除。 – JavaNoob 2010-09-29 08:44:54

    +0

    @JavaNoob:显示您的新代码 – ysth 2010-09-29 14:53:57

    0

    另外两个问题:

    1. 如果删除调用 system('clear')是否从的gethostbyname错误 得到显示 呢?

    2. 为什么要使用 system('/root/Desktop/showdns.pl') 要递归调用相同的脚本? 使用exec 而不是system不是更好吗? exec终止当前进程 。而system 整个新进程分叉和 等待该进程退出。因此,如果您的用户输入了例如20 无效的主机名,那么您将最终得到 ,其中20个进程正在等待 最近创建的最近的那个 。

    GR, LDX

    +0

    @Idx 1)如果我在删除系统时使用“if”循环(清除),我仍然看不到错误。 2)系统似乎是一个更好的选择,因为我也在使用系统来清除屏幕。但我已经尝试过exec,输出没有变化。谢谢。 – JavaNoob 2010-09-30 01:04:23

    +0

    系统是'清除'的好选择,因为这是一个启动的过程,清除屏幕,然后退出。因此返回到您的原始代码。对递归调用脚本是一个不错的选择,因为直到用户输入有效的主机名才能查找,因此它不会退出,因此,除非用户输入有效的主机名,否则不会返回到脚本。然后它返回到您的原始脚本,但只是退出。关于你原来的问题:你在什么系统上?如果我在winxp sp3系统上运行你的代码,我会得到“未知错误”。没有帮助,但与你得到的不同。 – ldx 2010-09-30 07:05:12

    +0

    打印$时会得到什么?这应该包含任何h_error将包含如果您将使用C而不是perl – ldx 2010-09-30 07:06:28

    -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的添加 “DNS”。的conf文件如下:

    hosts:  files dns 
    
    +0

    这个问题不是关于一个基本的DNS问题,而是关于在Perl中处理DNS查找失败。这个答案是无关的。 – Richlv 2016-11-20 18:22:43