Таймаут и переход к следующему запросу в скрипте - PullRequest
0 голосов
/ 17 октября 2019

У меня есть скрипт, который ищет конкретные записи для домена.

Т.е. домен Cpanel.domain;ftp.domain;mail.domain;MX запись и TXT записи. Когда конкретная запись не найдена, сценарий останавливается, но не завершается ошибкой или завершается, пока не будет отменен вручную

echo "==[ DNS Check ]=="
echo "Google 8.8.8.8 : $(dig @8.8.8.8 $dom +short)"
echo "Cloudflare 1.1.1.1 : $(dig @1.1.1.1 $dom +short)"
echo "Quad 9 9.9.9.9 : $(dig @9.9.9.9 $dom +short)"
echo "Afrihost ns.dns1.co.za : $(dig @ns.dns1.co.za $dom +short)"
#echo "Afrihost 169.1.1.1 : $(dig @169.1.1.1 $dom +short)"
echo "-- -- -- -- -- -- -- -- -- -- -- -- "
echo
echo "==[ PUBLIC ]=="
getIP=$(dig @8.8.8.8 +short $dom)
if [[ "$getIP" == ""  ]];then
    echo "Domain NSLookup failed!! - Public DNS Resolution failed."
else
    echo "IP : $getIP :: $(nslookup $getIP |grep "name =" |awk '{print $4}')"
    echo "cPanel : $(dig @8.8.8.8 +short cpanel.$dom) -- $(nslookup $(dig @8.8.8.8 +short cpanel.$dom) |grep "name =" |awk '{print $4}')"
    echo "FTP : $(dig @8.8.8.8 +short ftp.$dom) -- $(nslookup $(dig @8.8.8.8 +short ftp.$dom) |grep "name =" |awk '{print $4}')"
    echo "mail.$dom : $(dig @8.8.8.8 +short mail.$dom) -- $(nslookup $(dig @8.8.8.8 +short mail.$dom) |grep "name =" |awk '{print $4}')"
fi

Вывод:

./resolve somedomain

Date : 17/10/2019 Time : 07.21.11

==[ DNS Check ]==
Google 8.8.8.8 : 103.9.170.0
Cloudflare 1.1.1.1 : 103.9.170.0
Quad 9 9.9.9.9 : 103.9.170.0
Afrihost ns.dns1.co.za : 
-- -- -- -- -- -- -- -- -- -- -- -- 

==[ PUBLIC ]==
IP : 103.9.170.0 :: hostingservername.
> 

Я бы хотел не останавливаться, а двигаться дальше или просто указать, что запись не найдена, а затем перейти к следующей команде.

В «>» будет запись cpanel.domain A, которая не существует для рассматриваемого домена.

Я хотел бы, чтобы это было напечатано «not found», а затем перейдите к следующей команде.

1 Ответ

0 голосов
/ 20 октября 2019

Итак, проблема в том, что dig возвращает пустую строку, поэтому, когда вы передаете ее в nslookup, он видит, что нет параметров командной строки, и работает в интерактивном режиме, то есть печатает приглашение > и ожидаетдля пользовательского ввода.

Чтобы избежать этого, я бы использовал некоторые простые функции для инкапсуляции вызовов dig и nslookup и включил проверку ошибок в эти функции:

declare    dns_server=8.8.8.8

function my_dig() {
  [ ${#1} -eq 0 ] && return 1

  local    ip=$(dig @${dns_server} +short ${1})
  [ ${#ip} -eq 0 ] && return 2

  echo ${ip}
}

function my_nslookup() {
  [ ${#1} -eq 0 ] && return 1

  local    hostname=$(nslookup ${1} | sed -n 's/.* name = \(.*\)/\1/p')
  [ ${#hostname} -eq 0 ] && echo "Not Found." && return 2

  echo ${hostname}
}

function print_line() {
  echo "${1} : ${2:-Not Found} -- $(my_nslookup ${2})"
}

...
# The rest of your code.
...

else
  print_line IP ${getIP}
  print_line cPanel $(my_dig cpanel.$dom)
  print_line FTP $(my_dig ftp.$dom)
  print_line mail.${dom} $(my_dig mail.$dom)
fi
...