远程文件的校验和

13

有没有一种通过命令行运行的程序可以计算远程文件的校验和?例如获取https://stackoverflow.com/opensearch.xml的校验和。

我想要能够获取新的rss / xml条目可用时的更新。我在考虑每隔一段时间对文件进行校验和,如果不同则必须有更新。我正在寻找编写检查新的rss / xml数据的Shell脚本。

5个回答

15

使用curl快速完成此操作的方法是将输出管道传递给sha1sum,如下所示:

curl -s http://stackoverflow.com/opensearch.xml|sha1sum

2
我还添加了 -L 选项... curl -sL URL | sha256sum (macOS) 或者 curl -sL URL | shasum -a 256 ... - vigo
curl -sL静默并且跟随重定向。在 Mac 上,我用 gsha256sum 替换 sha256sum - Pro Backup
在从像GitHub这样的网站获取文件时,拥有“-L”是至关重要的。它们掩盖了真实的URL并重定向到实际的资源位置。 - undefined

6
为了对文件进行校验和,您需要先下载它。相反,您可以在请求头中使用 If-Modified-Since,如果文件未更改,服务器将响应 304 not modified 头且不带内容,如果文件已更改,则会带有文件内容。您可能还想检查服务器是否支持 ETag。如果下载文件不是问题,您可以使用 md5_file 获取文件的 md5 校验和。

5

curl

curl有一个“-z”选项:

   -z/--time-cond <date expression>|<file>
          (HTTP/FTP) Request a file that has been modified later 
          than the given time and date, or one that has been modified before
          that  time.  The  <date expression> can be all sorts of date strings
          or if it doesn't match any internal ones, it is taken as a filename
          and tries to get the modification date (mtime) from <file> instead.
          See the curl_getdate(3) man pages for date expression details.

所以你可以做的是:

$ curl http://stackoverflow.com/opensearch.xml -z opensearch.xml -o opensearch.xml

如果远程文件比本地文件更新(本地文件可能不存在 - 这种情况下将下载),则会进行实际下载。这似乎正是您需要的...

wget

wget还有一个选项可以跟踪时间戳 - -N

When running Wget with -N, with or without -r or -p, the decision as to whether
or not to download a newer copy of a file depends on the local and remote
timestamp and size of the file.

-N, --timestamping               Turn on time-stamping.

如果使用wget,可以使用以下命令:

$ wget -N http://stackoverflow.com/opensearch.xml

1
警告:在使用 -O 选项时,时间戳功能无效。请参阅手册以获取详细信息。 - BozoJoe

1

你可以在bash下尝试这个命令:

wget <http://your file link>

md5sum <your file name>

谢谢。我知道这个。如果可能的话,我想避免下载文件。只需不断检查新更新会很好...这样一旦有更新我就知道了。这不是 RSS 阅读器所做的吗? - rich
当有更新时,您想在哪里显示消息?在日志文件中还是在当前的bash中? - TheOneTeam
当前的bash。我想要做的是第一次获取整个文件并检查条件(查找特定单词),然后今后的更新只需检查新内容。我想检查无限数量的URL。基本上,这类似于一个RSS阅读器,但我希望检查数据并在符合某些条件时对数据进行处理。但当然我不想因为每秒钟检查而遭受域名的麻烦。 - rich
那么,没有轮询机制,普通的 RSS 阅读器是如何工作的呢? :) 我可以提供给您的是使用无限循环并每秒检查文件... - TheOneTeam
不确定如何使用rss阅读器:)。如果我每秒钟检查一次文件,我觉得域名不会对我太满意。我打算用for循环来实现,但我想让它符合rss阅读器的相同规则。我相信他们有一些关于检查频率等方面的规定...对吧? - rich

0

你应该首先检查HTTP头以查看服务器是否愿意告诉你文件的来源;如果不需要,获取整个文件被认为是不好的做法。

否则,你将需要使用类似wget或curl的工具来获取文件,所以我真的希望你不打算处理任何大文件。


这就是 RSS 阅读器的工作方式吗?它们如何知道 XML 文件发生了变化并通知我?它们会不断检查 HTTP 标头吗?我喜欢这个想法...你能提供一个通过命令行实现这个功能的好例子吗? - rich
是的,如果您阅读curl的文档,您会发现它有各种选项可以仅获取HTTP头。 - Olipro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接