我是一名刚学习网络安全的学生。我们使用 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
还将打印前导空格