【问题标题】:Add input lines subset to prefix shell script output将输入行子集添加到 shell 脚本输出的前缀
【发布时间】:2016-01-18 15:07:18
【问题描述】:

我有一个复杂的 shell 脚本 (check_axfr.sh) 来检查域是否容易受到 DNS 区域传输漏洞的影响。只需将single domain 作为argument 即可检查该域是否易受攻击。

例子:

#./check_axfr.sh example.com

如果它在域的任何name servers 中存在漏洞,它会产生以下结果。

DOMAIN example.com: ns0.example.com. Vulnerable
DOMAIN example.com: ns1.example.com. Not Vulnerable

为了检查多个域,我将所有域列表 (100) 保存在文件 Input.txt 中。

example.com
abc.com
mno.com
xyz.com
prq.com
.......

我试过了,

for i in $(cat Input.txt);do sh check_axfr.sh $i;done

现在,我的输入文件 (Input.txt) 现在将包含 number,domain

1,example.com
2,abc.com
3,mno.com
4,xyz.com
5,prq.com
.........

我想得到输出,

1,DOMAIN example.com: ns0.example.com. Vulnerable
1,DOMAIN example.com: ns1.example.com. Not Vulnerable
2,DOMAIN abc.com    : ns1.abc.com. Not Vulnerable  
3,DOMAIN mno.com    : .............
4,DOMAIN xyz.com    : .............
5,DOMAIN prq.com    : .............

我不熟悉 shell 脚本并且我不想更改父脚本,有人可以帮我解决这个问题吗?

【问题讨论】:

  • Bash 和其他 shell 可以修剪变量中保存的字符串的前导字符。而不是$i 使用"${i#*,}";它应该删除任何前导字符,直到逗号。例如,当i='34,gog.com'"${i#*,}"gog.com。阅读 bash 手册页中的 Shell Parameter Expansion section
  • BashFAQ #1 -- mywiki.wooledge.org/BashFAQ/001 -- 将是一个很好的起点。
  • 原始标题(“shell 脚本问题”)没有以任何有用的方式描述问题(从字面上看,任何标记为“shell”的问题都可以具有相同的标题,并且具有描述性)。我试图让它更有用,但因为最初并不清楚,所以很难确定我做得是否准确。 @Arun,请检查并更正。
  • 顺便说一句——在可执行脚本上使用诸如.sh.bash 之类的扩展名并不是一个好习惯。对于可执行文件,它们的文件名是用于运行它们的命令的名称;在文件名中包含语言意味着您不能在不使名称误导或更改所有调用者的情况下用不同的语言重写脚本。此外,这根本不是惯例:你运行ls,而不是ls.elf
  • ....sh.ksh.bash的唯一合适的地方是一个脚本,该脚本预计将被引入 shell,不在它自己的解释器中执行。例如,这对于 shell 库很常见。

标签: bash shell


【解决方案1】:

读取输入行并在, 上拆分以获取输入行的各个部分。使用第二部分,域名调用check.axfr.sh

# wrapper.sh    
while IFS=, read -r id domain
do
    result=$(./check.axfr.sh "$domain")
    echo "$id,$result"
done

用法:

$ bash wrapper.sh < Input.txt

【讨论】:

  • @CharlesDuffy 行情不会受到伤害。但是域名的输入可能不会产生缺少引号的问题。
  • 如果我们希望输入在其预期域内,是的。这不是一个好的做法——我在我的一位雇主那里看到的最大的数据丢失事件是因为缺少引用,作者认为这无关紧要,因为输入“不能”只是十六进制字符——直到生成该输入的程序中存在缓冲区溢出...
  • 这很简单,但在输出中只有每个域的第一行前面有数字。例如1,DOMAIN domain1.com: ns0.example.com. Vulnerable\n DOMAIN domain1.com: ns1.example.com. Not Vulnerable
【解决方案2】:

如果您不介意安装一个额外的工具,您也可以使用parallel 用一个命令来执行此操作(显然以并行模式而不是默认的串行模式运行作业):

parallel -C',' --keep-order './check.axfr.sh "{2}" | sed "s/^/{1}, /"' < Input.txt

突围

parallel 
  -C ','                  # use comma as column separator of each input line
  --keep-order            # keep the same order in the output
  './check.axfr.sh "{2}"  # execute per job the check.axfr.sh passing domain column
  | sed "s/^/{1}, /"'     # Add the first column (number) before each line 
                          # of the output of the script
  < Input.txt  # load lines from Input.txt file

输出

1,域 domain1.com:ns0.example.com。易受伤害
1、DOMAIN domain1.com:ns1.example.com。不易受伤害
2、DOMAIN domain2.com:ns0.example.com。易受伤害
2、DOMAIN domain2.com:ns1.example.com。不易受伤害
3、DOMAIN domain3.com:ns0.example.com。易受伤害
3、DOMAIN domain3.com:ns1.example.com。不易受伤害
4、DOMAIN domain4.com:ns0.example.com。易受伤害
4、DOMAIN domain4.com:ns1.example.com。不易受伤害

注意

如果您想节省一些位,可以使用 parallel 从输入文件中完全删除 number 列并使用它:

parallel --keep-order './check.axfr.sh "{}" | sed "s/^/{#}, /"' < Input.txt

{#} 是执行的作业的 ID 号。输出将是相同的。

【讨论】:

  • 感谢您提供明确的解决方案。我不能忽略列中的数字,因为它可以让我更好地了解哪个 ID 在标准输出中显示时易受攻击。
  • @Arun:很高兴听到这个消息!最后一个命令是一种可选方法,无需您放入第一个文件中的行号即可获得您需要的完全相同的输出(每行由渐进式编号{#}标识的不同作业处理,因此结果是等价的到您在Input.txt 文件中放入的行数)。使用相同的输入文件尝试parallel -C',' --keep-order './check.axfr.sh "{2}" | sed "s/^/{#}, /"' &lt; Input.txt:您无需使用数字列即可获得相同的输出。无论如何,这只是一个额外的观点,不是必需的
  • 是的,记下了老兄!无论如何谢谢。
猜你喜欢
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2015-05-30
  • 2013-10-29
  • 1970-01-01
  • 2020-05-13
  • 2020-04-12
相关资源
最近更新 更多