【发布时间】:2019-12-18 20:19:48
【问题描述】:
尝试构建一个 shell 脚本来确定站点是否使用 PulseVPN。 该脚本接受一个包含 URL 列表的输入文件,逐行迭代每个 URL,执行 cURL 操作并 grep 获取特定字符串。如果找到字符串,则显示回显消息“使用 PulseVPN 的网站”
这是我的代码 -
Keyword="dana-na" # keyword to find for PulseSecure SSL VPN
while read -r line;
do
if curl -s -L "$line" | grep "$keyword" > /dev/null
then
# if the keyword is in the conent
echo " The website $line is using Pulse Secure VPN"
else
echo "Pulse Secure VPN Not Found on $line"
fi
done < urls.txt
问题 代码正在运行,但这里的问题是当我在输入文件中只包含一个 URL 时。它给出了正确的结果。但是如果我在输入文件中包含多个 URL,那么它会给出不正确的结果。谁能解释为什么会这样。代码有什么问题吗?
【问题讨论】:
-
您的代码无法运行,因为 grep 在您定义关键字时使用了 $keyword 变量(大小写不同)。一般来说,你的循环应该可以正常工作,但它会打印 The website $line is using Pulse Secure VPN for all urls due to keyword is empty
-
您看到的错误结果是什么?
-
请注意
grep -q "$keyword"比grep "$keyword" >/dev/null更高效,因为前者(但不是后者)可以在找到第一个匹配项后立即停止,而不是读取到文件末尾并将内容写入/dev/null。 -
顺便说一句,运行
bash -x yourscript来跟踪运行的各个命令并将它们与您的预期进行比较通常很有帮助。例如,如果您看到您的行在末尾显示有$'\r'字符,那么您就知道存在换行符类型问题;如果您看到使用''而不是您的关键字,您就知道要查看(并且可以找出Keyword/keyword名称不匹配问题)等。 -
我不确定 curl 是否会使用其标准输入中的任何数据,但您可能想尝试
curl <&- ...以确保它没有读取用于read的数据。