Как вывести ошибку для разрешения DNS в Perl? - PullRequest
0 голосов
/ 29 сентября 2010

В настоящее время у меня есть сценарий обратного просмотра DNS, который работает, однако существует небольшая проблема в том, что скрипт может выводить системные ошибки DNS.

Проблемы идут так:

  1. Пользовательские ключи в ложном / неправильном имени интернет-адреса и т. Д. "Www.whyisthednsnothappening.com"
  2. Затем сценарий очистит экран с помощью системы (очистить)
  3. После этого скрипт выдаст сообщение «невозможно разрешить DNS. Ошибка вызвана: различными системными ошибками »
  4. Сценарий перенаправляет пользователя обратно в то же меню / сценарий, чтобы снова ввести адрес имени.

Итак, основная проблема теперь в шаге 3, который мне показывает только сценарий «Не удается разрешить DNS. Ошибка связана с: БЛАНК », который БЛАНК должен показать ошибки типа «Недопустимая длина аргумента для Socket :: inet_ntoa, длина равна 0, должно быть 4 в ./showdns.pl строка 28, <> строка 1». и меню DNS-скрипта расположено ниже ошибки print.

Коды:

#!/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 ]

2 голосов
/ 29 сентября 2010

Ах, я понимаю, что вы имеете в виду. Системный («очистить») вызов очищает $! переменная, прежде чем вы сможете распечатать ошибку из 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) делает то же самое.

0 голосов
/ 07 сентября 2011

Пожалуйста, проверьте следующее, чтобы решить вышеуказанные проблемы "dns" в скрипте perl.

Поскольку DNS-сервер не работает, Perl не будет разрешать адрес.поэтому он возвращает пустую строку и inet_ntoa выдаст ошибку для этой пустой строки.

Если вы используете систему Linux, проверьте следующее:

a) Проверьте интернет-адрес в файле /etc/resolv.conf

nameserver 172.19.1.11  (IP address of your internet or survice provider)

b) Добавьте «dns» в файл /etc/nsswitch.conf следующим образом:

hosts:      files dns
0 голосов
/ 29 сентября 2010

Два дополнительных вопроса:

  1. Если вы удалите вызов на system('clear') Отображается ли тогда ошибка из gethostbyname?

  2. ПочемуВы используете system('/root/Desktop/showdns.pl') для рекурсивного вызова одного и того же сценария?Не лучше ли использовать exec вместо system?exec завершает текущий процесс.в то время как system разветвляется на весь новый процесс и ожидает его завершения.Поэтому, если ваши пользователи введут, например, 20 неверных имен хостов, вы получите 20 процессов, ожидающих только что созданного последним.

Gr, ldx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...