Guest User

Untitled

a guest
Feb 21st, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.55 KB | None | 0 0
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Net::DNS;
  4.  
  5. if ($ARGV[0]) {
  6. gptr_a($ARGV[0]);
  7. } else {
  8. die "Usage: $0 HOSTNAME\n";
  9. }
  10.  
  11. # 1. получаем имя хоста, посмотреть, что днс ответит на запрос по нему
  12. # ответ $query->answer если А-запись есть: Net::DNS::RR::A=HASH(0x8016d1738)
  13. # в случае с CNAME:
  14. #Net::DNS::RR::CNAME=HASH(0x8016d1738)
  15. #Net::DNS::RR::CNAME=HASH(0x8010f1ba0)
  16. #Net::DNS::RR::A=HASH(0x8010f1d50)
  17. # 2. в любом случае, сначала пойдут все cname, потом все A
  18. # их и распихиваем по массивам @cnames и @ips
  19. # 3. резолвим айпишники в хосты и выводим список цнеймов и ip: host
  20.  
  21. sub gptr_a {
  22. my $qhost = $_[0];
  23. my $res = Net::DNS::Resolver->new;
  24. my $query = $res->query($qhost, 'A');
  25. push(my @cnames, $qhost);
  26. my @ips;
  27. my %aptr;
  28. if ($query) {
  29. foreach my $rr ($query->answer) {
  30. my $amt;
  31. if ($rr =~ /Net::DNS::RR::CNAME=HASH(.+)/) {
  32. $amt = 'cname';
  33. push(@cnames, $rr->$amt);
  34. } elsif ($rr =~ /Net::DNS::RR::A=HASH(.+)/) {
  35. $amt = 'address';
  36. push(@ips, $rr->$amt);
  37. }
  38. }
  39. } else {
  40. print $res->errorstring, "\n";
  41. }
  42.  
  43. foreach (@ips) {
  44. if (/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/) { # if $_ has IP
  45. my @ptrs = ip2ptrs($_);
  46. my $ptrs = join ' ', @ptrs;
  47. $aptr{$_} = $ptrs;
  48. } else {
  49. $aptr{$_} = 'Unable to resolve';
  50. }
  51. }
  52.  
  53. if (@cnames > 1) {
  54. my $cnames = join ' -> ', @cnames;
  55. printf "%1s CNAMES: ${cnames}\n", '';
  56. }
  57. foreach my $key (sort keys %aptr) {
  58. printf "%15s: $aptr{$key}\n", $key;
  59. }
  60. }
  61.  
  62. sub ip2ptrs {
  63. my $qstring = $_[0];
  64. my $qtype = 'PTR';
  65. my $amt = 'ptrdname';
  66. my @answrs;
  67. my $res = Net::DNS::Resolver->new;
  68. my $query = $res->query($qstring, $qtype);
  69. if ($query) {
  70. foreach my $rr ($query->answer) {
  71. push(@answrs, $rr->$amt);
  72. }
  73. } else {
  74. push(@answrs, $res->errorstring);
  75. }
  76. @answrs;
  77. }
Add Comment
Please, Sign In to add comment