返回的 IP 地址nslookup

返回的 IP 地址nslookup

我是一名刚学习网络安全的学生。我们使用 kali linux 进行渗透测试阶段。我也是 bash 脚本的新手。

命令:

nslookup -type=mx cathay.com.sg

输出示例

Server:     192.168.48.2
Address:    192.168.48.2#53

Non-authoritative answer:
cathay.com.sg   mail exchanger = 0 cathay-com-sg.mail.protection.outlook.com.

Authoritative answers can be found from:

我希望它只显示:

192.168.48.2
192.168.48.2#53

但是,我当前的脚本

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

结果出现此错误:

./nslookupscr.sh: line 4: syntax error near unexpected token `|'
./nslookupscr.sh: line 4: `|awk -F":" '{print $2}''

我听说过使用 dig 来代替,但我们还没有讨论过。我们只了解了 awk 和 grep 进行格式化,所以我不确定它有什么问题。

答案1

返回的 IP 地址nslookup

阅读您的请求,您似乎试图显示MX域的 IP 地址。

但是,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)有 name: 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:.

乌斯格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,但 2 个查询仅运行 1 次:

由于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")

答案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还将打印前导空格

相关内容