关于bash的逻辑方法

时间:2017-04-11 22:02:46

标签: bash

#!/bin/bash
echo -n "Enter the domain name > "
read name
dig -t ns "$name" | cut -d ";" -f3 | cut -d ":" -f2| grep ns | cut -f6 > registerfile.txt;
cat registerfile.txt | while read line; do dig axfr "@$line" "$name"; done | cut -d"." -f-4 > nmap.txt

直到本节完成。下面,它可能与行和名称参数不匹配。怎么改变?

cat nmap.txt | while read line; do if [ "$line" == "$name" ]; then host "$line"; fi; done > ping.txt 
cat ping.txt | cut -d " " -f4  | while read line; do if  [[ "$line" =~ ^[0-9]+$ ]]; then nmap -sS "$line";fi ;done

1 个答案:

答案 0 :(得分:1)

目前还不清楚哪里出了问题,但这里有一个重构,希望至少可以推动你朝着正确的方向前进。

#!/bin/bash
read -p "Enter the domain name > " name
dig +short -t ns "$name" |
tee registerfile.txt |
while read line; do
    dig axfr "@$line" "$name"
done |
cut -d"." -f-4 |
tee nmap.txt |
while read line; do 
    if [ "$line" = "$name" ]; then
         host "$line"
    fi
done > ping.txt 
cut -d " " -f4 ping.txt | 
grep -E '^[0-9]+$' |
xargs -r -n 1 nmap -sS

你在if [ "$line" = "$name" ]; then host "$line"; fi无效的评论中的评论表明,那里的逻辑有些错误。它目前检查每一行是否与原始域名相同,然后在这些情况下反复查找,这似乎是一件奇怪的事情;但只给出代码和“不起作用”,很难说它应该完成什么。如果您真的想要其他东西,则需要更具体地了解您的需求。也许你实际上正在寻找像

这样的东西
... tee nmap.txt |
# Extract the lines which contain $name at the end
grep "\.$name\$" |
xargs -n 1 dig +short |
tee ping.txt |
grep -E '^[0-9]+$' ...

使用多个静态命名文件是反模式;很明显,如果这些文件不用于外部目的,只需取出tee命令并运行整个管道,而不使用中间输出文件。如果你确实需要这些文件,在每次运行时覆盖它们似乎有问题 - 可能会为文件名添加一个唯一的日期戳后缀?