Как обновить nsswitch для использования второго DNS сервера, если есть NXDOMAIN?

Ваш сценарий действительно работает. Вы уверены, что ваш sites.txt правильный? Например, я попробовал:

$ cat sites.txt 
google.com
unix.stackexchange.com
yahoo.com

Я сохранил ваш сценарий как foo.sh , и запуск его в файле выше дает:

$ foo.sh 2>/dev/null
HTTP/1.1 302 Found
http://google.com is up
HTTP/1.1 200 OK
http://unix.stackexchange.com is up
HTTP/1.1 301 Redirect
[10-03-2017:20:49:29] http://yahoo.com is DOWN. Status:HTTP/1.1 301 Redirect

Между прочим, как вы можете видеть выше, он не работает для yahoo.com, который выполняет перенаправление. Возможно, лучше было бы использовать ping для проверки. Примерно так (включая некоторые другие общие улучшения):

while read site
do
    if ping -c1 -q "$site" &>/dev/null; then
        echo "$site is up"
    else
        echo "[$(date +%d-%m-%Y:%H:%M:%S)] $site is not reachable."
    fi  
done < sites.txt

Если вам действительно нужен статус, используйте:

#!/bin/bash

## No need for cat, while can take a file as input
while read site
do
    ## Try not to use UPPER CASE variables to avoid conflicts
    ## with the default environmental variable names. 
    site="http://$site";
    response=$(curl -I "$site" 2>/dev/null | head -n1)
    ## grep -q is silent
    if grep -qE '200 OK|302 Moved|302 Found|301 Redirect' <<<"$response"; then
        echo "$site is up"
    else
        ## better to run 'date' on the fly, if you do it once
        ## at the beginning, the time shown might be very different.
        echo "[$(date +%d-%m-%Y:%H:%M:%S)] $site is DOWN. Status:$response" 
    fi  
done < sites.txt
1
29.08.2017, 12:26
1 ответ

Я не думаю, что вы можете сделать это с nsswitch.conf. В этом файле указываются источники данных, используемые для каждой категории. Он не предназначен для «влияния» на работу каждого источника (в вашем случае, используйте другой DNS-сервер, если первый ответ вас не устраивает ).

Вы можете попробовать с помощью [STATUS=ACTION]изменить поведение в соответствии с результатом, полученным из предыдущего источника данных. Но это не то, что вам нужно, потому что вы не хотите менять источник данных (dns ).

Вы сами это сказали :если DNSSERVERIP1 не знает ответа (NXDOMAIN ), это означает, что сервер имеет право ответить на этот вопрос. Таким образом, ответ окончательный (относительно спецификации DNS ), и нет смысла запрашивать другой сервер. Опять же, это по определению, и вы не можете его переопределить.

Единственный способ заставить это работать — убедиться, что ваши настройки DNS непротиворечивы. :Если DNSSERVERIP1 и DNSSERVERIP2 должны быть клонами, сделайте это. Если у DNSSERVERIP2 есть ответ, он также должен быть у DNSSERVERIP1.

1
27.01.2020, 23:45

Теги

Похожие вопросы