Отображать только IP-адреса из nslookup без записи вывода в файл

Очевидно, вы включили полное ведение журнала вывода в sudo (ers ).

Самый простой способ освободить место (возможно, удалив журналы sudo) — либо войти в систему как root, либо использовать su, если это позволяют ваши настройки.

В зависимости от того, сколько /var/logзаполнено, эти процедуры могут быть успешными или нет. В худшем случае загрузка в одиночном режиме или из работающей системы позволит вам все исправить.

Если у вас нет особых потребностей в регистрации большого количества sudoопераций, я бы отредактировал /etc/sudoers, чтобы изменить настройки ведения журнала. Такая подробная настройка снова быстро исчерпает доступное пространство.

1
08.12.2019, 11:33
2 ответа

Я бы использовал

#!/bin/bash
#nslookup but display only IP
nslookup -type=mx cathay.com.sg |
awk -F":" 'NF==2 {print $2}'

обратите внимание, что

  • вертикальная черта |находится в конце строки и используется как символ продолжения.
  • NF==2означает, что мы выбираем строку с 2 полями
  • print $2будет печатать также начальный пробел
0
27.01.2020, 23:55

IP-адрес, возвращенныйnslookup

Читая ваш запрос, вы пытаетесь отобразитьMXIP-адрес для домена.

Но nslookupпервые строки сообщают только имя и IP-адрес вашего настроенного DNS:

nslookup -type=mx cathay.com.sg | cat -n
     1      Server:         192.168.1.1
     2      Address:        192.168.1.1#53
     3
     4      Non-authoritative answer:
     5      cathay.com.sg   mail exchanger = 0 cathay-com-sg.mail.protection.outlook.com.
     6
     7      Authoritative answers can be found from:
     8      cathay.com.sg   nameserver = ns2.dreamhost.com.
     9      cathay.com.sg   nameserver = ns3.dreamhost.com.
    10      cathay.com.sg   nameserver = ns1.dreamhost.com.
    11      ns1.dreamhost.com       internet address = 64.90.62.230
    12      ns2.dreamhost.com       internet address = 208.97.182.10
    13      ns3.dreamhost.com       internet address = 66.33.205.230

Реальный ответ начинается после строки 4 и содержит только одну строку, сообщающую MX (с приоритетом = 0 )имеет имя:cathay-com-sg.mail.protection.outlook.com.

После этого вы должны задать (хотя бы )один второй вопрос:

nslookup cathay-com-sg.mail.protection.outlook.com |cat -n
     1      Server:         192.168.1.1
     2      Address:        192.168.1.1#53
     3
     4      Non-authoritative answer:
     5      Name:   cathay-com-sg.mail.protection.outlook.com
     6      Address: 104.47.124.36
     7      Name:   cathay-com-sg.mail.protection.outlook.com
     8      Address: 104.47.126.36

Опять же, ответ начинается после строки 4 и содержит два Address:.

Usig dig, под , можно было сделать просто:

mapfile -t mxnames < <(dig +noall +answer mx cathay.com.sg)
mxnames=("${mxnames[@]##*[ $'\t']}")
mapfile -t mxips < <(dig +noall +answer ${mxnames[@]})
mxips=("${mxips[@]##*[ $'\t']}")

Потом

declare -p mxips mxnames

может вернуть что-то вроде:

declare -a mxips=([0]="67.205.10.249" [1]="77.32.207.225" [2]="104.47.125.36" [3]="104.47.126.36")
declare -a mxnames=([0]="cathay.com.sg." [1]="cathay-com-sg.mail.protection.outlook.com.")

Вы можете использовать

for ip in ${mxips[@]};do
    ping -{c,W}1 $ip &>/dev/null && echo $ip ok || echo $ip -- &
        sleep.02
  done |
    cat
77.32.207.225 ok
67.205.10.249 ok
104.47.125.36 --
104.47.126.36 --

Некоторые пояснения:

  • Синтаксис dig +noall +answer <QUERY>будет возвращать только одну строку ответа, например:

     dig +noall +answer mx cathay.com.sg
     cathay.com.sg.    12345   IN   MX   0 cathay-com-sg.mail.protection.outlook.com.
    
     dig +noall +answer $mxname
     cathay-com-sg.mail.protection.outlook.com. 10 IN A 104.47.125.36
     cathay-com-sg.mail.protection.outlook.com. 10 IN A 104.47.126.36
    

Для получения дополнительной информации см. man dig.

  • Синтаксис ${var##* }так называемый Расширение параметра , будет отбрасывать строку слева до последнего пробела .

     mxname=${mxname##* }
    

    Отбрасывает левую часть ответа dig, затем сохраняет cathay-com-sg.mail.protection.outlook.com.в $mxname, например

     mxips+=(${line##* })
    

    добавит последнюю часть предыдущего ответа в массив$mxips.

Посмотрите man bash, найдитеРасширение параметра:
man -P'less +"/^ *Parameter Expansion"' bash.

Или с использованием nslookup, но только с 1 запуском для 2 запросов:

Поскольку nslookupможет работать в интерактивном режиме и, таким образом, может отвечать на несколько запросов, существует функция, использующая 1ответвление nslookupдля запроса столько запросов, сколько необходимо для список всех IP-адресов для одного домена:

mxIps ()  { 
    local target=$1 line foo;
    local -a mxnames=() mxips=();
    mkfifo fifo-nsl;                 # Fifo for binding nslookup output
    exec 7> >(stdbuf -i0 -o0 nslookup >fifo-nsl);
    exec 6< fifo-nsl;
    rm fifo-nsl;                     # As FD 6 and 7 are open, we could remove them
    printf "set type=mx\n%s\n" $target 1>&7;  # 1st query
    read -u 6 line;                           # wait for answer and drop 1st line
    while read -t.002 -u 6 line; do
        [ "$line" ] && [ -z "${line%%$target*mail exchanger*}" ] &&
            mxnames+=(${line##* });           # Add to mxnames array
    done;
    printf 'set type=A\n' 1>&7;               # Set -type=A
    for mxname in ${mxnames[@]%.};
    do
        echo $mxname 1>&7;                    # Next query
        read -u 6 line;                       # Wait for answer and
        read -u 6 line;                       # drops two first lines
        while read -t.002 -u 6 line; do
            [ "$line" ] && [ -z "${line%%Address:*}" ] &&
                mxips+=(${line##* });         # Add to mxips array
        done;
    done;
    echo exit 1>&7;                           # End nslookup sub process
    exec 6>&-;                                # Close FD 6, then 7
    exec 7>&-;
    declare -p mxips                          # Dump result
}

Потом

mxIps cathay.com.sg
declare -a mxips=([0]="104.47.125.36" [1]="104.47.126.36")
1
27.01.2020, 23:55

Теги

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