我编写了以下bash脚本来检查domain.list
中的域列表和dir.list
中的多个目录。
@是第一个域,它首先尝试查找文件 http://example.com 如果成功脚本完成并退出没问题。
如果失败则去检查
https://example.com
如果确定,脚本完成并退出,
如果不
检查一下
http://example.com/$list
个不同的目录。
如果找到文件脚本并退出,则无法找到
然后去看看吧
不同目录的https://example.com/$list
但问题是,当第一次检查失败并且第二次检查失败时,它进入第三次检查,但它继续循环,在第三个命令和第四个命令,告诉它查找文件或已完成的目录列表。
我希望脚本在到达第3个命令时运行它并在目录列表中检查它,告诉列表完成,而不是去第4个命令告诉它完成
在我的脚本中,它一直在多个目录中检查单个域,每次检查一个新目录,它从bagain启动整个脚本,并从头开始再次运行第一个命令和第二个命令,我不需要,大量的时间浪费
谢谢
#!/bin/bash
dirs=(`cat dir.list`)
doms=( `cat domain.list`)
for dom in "${doms[@]}"
do
for dir in "${dirs[@]}"
do
target1="http://${dom}"
target2="https://${dom}"
target3="http://${dom}/${dir}"
target4="https://${dom}/${dir}"
if curl -s --insecure -m2 ${target1}/test.txt | grep "success" > /dev/null ;then
echo ${target1} >> dir.result
break
elif curl -s --insecure -m2 ${target2}/test.txt | grep "success" > /dev/null;then
echo ${target2} >> dir.result
break
elif curl -s --insecure -m2 ${target3}/test.txt | grep "success" > /dev/null; then
echo ${target3} >> dir.result
break
elif curl -s --insecure -m2 ${target4}/test.txt | grep "success" > /dev/null ; then
echo ${target4} >> dir.result
break
fi
done
done
答案 0 :(得分:1)
您的代码不是最佳的;如果你有5个'dir'值的列表,你检查5次是否存在http://${domain}/test.txt
- 但是如果它第一次不存在,则可能是其他时间也不存在。
您使用dir
表示子目录名称,但您的代码使用http://${dom}:${dir}
而不是更正常的http://${dom}/${dir}
。从技术上讲,冒号后面的第一个斜杠是端口号,而不是目录。我将假设这是一个错字,结肠应该用斜线代替。
一般情况下,请勿使用反蜱符号;请改用$(…)
。避免重复编码。
我认为你可以将你的脚本压缩成这样的东西:
#!/bin/bash
dirs=( $(cat dir.list) )
file=test.txt
fetch_file()
{
if curl -s --insecure -m2 "${1:?}/${file}" | grep "success" > /dev/null
then
echo "${1}"
return 0
else
return 1
fi
}
for dom in $(cat domain.list)
do
for proto in http https
do
fetch_file "${proto}://{$dom}" && break
for dir in "${dirs[@]}"
do
fetch_file "${proto}://${dom}/${dir}" && break 2
done
done
done > dir.result
如果域名列表很大,您可以考虑使用while read dom; do …; done < domain.list
而不是$(cat domain.list)
。定义变量site="${proto}://${dom}"
然后在fetch_file
的调用中使用它是可行的,甚至可能是明智的。
答案 1 :(得分:0)
您可以使用此脚本:
while read dom; do
while read dir; do
target1="http://${dom}"
target2="https://${dom}"
target3="http://${dom}:${dir}"
target4="https://${dom}:${dir}"
if curl -s --insecure -m2 ${target1}/test.txt | grep -q "success"; then
echo ${target1} >> dir.result
break 2
elif curl -s --insecure -m2 ${target2}/test.txt | grep -q "success"; then
echo ${target2} >> dir.result
break 2
elif curl -s --insecure -m2 ${target3}/test.txt | grep -q "success"; then
echo ${target3} >> dir.result
break 2
elif curl -s --insecure -m2 ${target4}/test.txt | grep -q "success"; then
echo ${target4} >> dir.result
break 2
fi
done < dir.list
done < domain.list