我已经编写了以下bash脚本来检查来自domain.list
的域列表和来自dir.list
的多个目录。
@是第一个域,它首先尝试在http://example.com如果成功脚本完成并退出,没有问题。
如果失败,请去检查https://example.com如果可以,脚本完成并退出,如果不是在查看不同目录的CCD_ 3。
如果找到文件,脚本已完成并退出,如果找不到然后去查一下不同目录的https://example.com/$list
但问题是,当第一次检查失败,第二次检查失败时,它会进行第三次检查,但它会继续循环,在第三个命令和第四个命令中,告诉它查找文件或目录列表已完成。
我希望脚本在到达第三个命令时运行它,并在目录列表中检查它,告诉列表完成,而不是去第四个命令,告诉它完成
在我的脚本中,它一直在多个目录中检查单个域,每次检查一个新目录时,它都会从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
您的代码是次优的;如果你有一个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
的调用中使用它是可行的,甚至可能是明智的。
您可以使用以下脚本:
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