Bash 脚本:下载html 文件,与之前版本比较并显示差异

Bash script: Download html file, compare with previous version and display the difference

本网站列出了一些可能会随时间变化的 IP 地址。 https://support.symantec.com/en_US/article.TECH244698.html

现在我想写一个bash脚本(必须是bash,python或PHP不能用)下载上面提到的html 文件一次,然后每次脚本 运行 时将新版本与旧版本进行比较。如果存在差异,应将其显示并记录到文件中,并在后续步骤中发送电子邮件通知。

现在看来,这在理论上似乎是一件容易的事,但我无法得出任何结果。如果我能对如何实现这一点有一些想法,我将不胜感激。

到目前为止,我尝试了以下方法:

#!/bin/bash
#check website for changes

URL="https://support.symantec.com/en_US/article.TECH244698.html"



mv  new.html old.html 2> /dev/null
curl -v --silent $URL --stderr - > new.html
diff -y --suppress-common-lines new.html old.html

URL="https://support.symantec.com/en_US/article.TECH244698.html"


for (( ; ; )); do
mv new.html old.html 2> /dev/null
curl $URL -L --compressed -s > new.html
DIFF_OUTPUT="$(diff new.html old.html)"
if [ "0" != "${#DIFF_OUTPUT}" ]; then
... ...

您可以使用以下 bash 脚本:

#!/bin/bash
#check website for changes

URL="https://support.symantec.com/en_US/article.TECH244698.html"


if [ -f new_ips.log ]; then
    mv  new_ips.log old_ips.log 2> /dev/null
fi

curl --silent "$URL" | \
grep -oP '\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(:?\/\d\d?)?\b' > new_ips.log

if [ -f new_ips.log ] && [ -f old_ips.log ]; then
        diff -y --suppress-common-lines new_ips.log old_ips.log
        exit 0;
fi

exit 1;

第一次需要 运行 两次,因为最初没有什么可比较的。

解释:

你真的很接近一个可行的解决方案,通过添加 grep -oP '\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(:?\/\d\d?)?\b' 将只获取 html 文件的 ips,你可以专注于你真正感兴趣的内容并避免出现分歧在页面设计或时间戳等方面

我在重新运行之前通过修改 new_ips.log 对其进行了测试,您有以下差异:

./check_ips.sh 
                                                              > 142.64.0.0/21
148.64.0.0/21                                                 | 142.64.0.1
148.64.0.1                                                    <

回答您的第二个问题,您希望在其中将国家/地区列表添加到您的 IP 地址。喜欢 Auckland, NZ IP address, Sydney, AU IP address.

我建议按以下方式更改 extraction/filtering 命令:

1) 我们需要使用解析器来解析 HTML 文档(xslt 技术足以满足我们的需求)

more generate_ips.xslt 
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
        <xsl:output method="text"/>

        <xsl:template match="/">
                <xsl:for-each select="/html/body/table/tbody/tr/td[1]/strong|/html/body/table/tbody/tr[2]/td">
                        <xsl:value-of select="."/><xsl:text>&#xa;</xsl:text>
                </xsl:for-each>
        </xsl:template>
</xsl:stylesheet>

此样式表将通过 xpath.

访问它们来打印国家名称和带有换行符的 ips

2) curl命令修改如下:

curl --silent "$URL" |\
 awk 'BEGIN{print "<html><body>"}/<table/{a=1;}/<\/table>/{print;a=0}{if(a)print;}END{print "</body></html>"}' |\
 xsltproc -html generate_ips.xslt - | sed '/^Egress/{d};s/^ *//'

您使用 awk 提取所有表并创建一个简化的 html 文件,其中仅包含我们感兴趣的 ip 表。然后调用 XSLT 处理器来生成输出,最后但并非最不重要的 sed 将删除不需要的行并清理显示

输出:

IP address range**
148.64.0.0/21**
148.64.0.0/21
148.64.0.1
148.64.7.254
Auckland, New Zealand
124.157.113.128/27 124.157.113.160/27 124.157.113.192/27
124.157.113.129 124.157.113.161 124.157.113.193
124.157.113.158 124.157.113.190 124.154.113.222
Chennai, India
180.179.40.0/26 180.179.46.64/27 148.64.6.0/23
180.179.40.1 180.179.46.65 148.64.6.1
180.179.40.62 180.179.46.94 148.64.7.254
Hong Kong
103.246.38.0/24 148.64.0.0/24
103.246.38.1 148.64.0.1
103.246.38.254 148.64.0.254
Mumbai, India
180.179.142.0/24 148.64.4.0/23
180.179.142.1 148.64.4.1
180.179.142.254 148.64.5.254
Seoul, South Korea
203.246.168.0/24
203.246.168.1
203.246.168.254
Shanghai, China
211.147.76.0/27 211.147.76.32/27
211.147.76.1 211.147.76.33
211.147.76.30 211.147.76.62
Singapore
103.246.37.0/24 148.64.3.0/24
103.246.37.1 148.64.3.1
103.246.37.254 148.64.3.254
Sydney, Australia
103.246.36.0/24
103.246.36.1
103.246.36.254
Taipei, Taiwan
61.58.46.0/24
61.58.46.1
61.58.46.254
Tokyo, Japan
103.9.99.0/24 103.246.39.0/24 148.64.1.0/24 
103.9.99.1 103.246.39.1 148.64.1.1
103.9.99.254 103.246.39.254 148.64.1.254

脚本的其余部分不应更改,并且可以按原样运行。