使用Linux命令,是否可以从HTTP服务器中仅读取前N个字节?

32
给定网址http://www.example.com,我们能否读取页面的前N个字节?
  • 使用wget,我们可以下载整个页面。

  • 使用curl,有-r,0-499指定前500个字节。似乎解决了这个问题。

    您还应该知道,许多HTTP/1.1服务器没有启用此功能,因此当您尝试获取范围时,您将获得整个文档。

  • 在Python中使用urlib。类似的问题here,但根据Konstantin的评论,这是真的吗?

    上次我尝试使用这种技术失败了,因为实际上不可能仅从HTTP服务器读取指定数量的数据,即您隐式地读取了所有HTTP响应,然后只读取其中的前N个字节。因此,最终您将下载整个1GB的恶意响应。

那么,我们如何在实践中从HTTP服务器读取前N个字节呢?

5个回答

32

您可以通过以下curl命令本地执行此操作(无需下载整个文档)。根据curl手册:

RANGES HTTP 1.1引入了字节范围。使用它,客户端可以请求获取指定文档的一个或多个子部分。curl支持使用-r标志实现此功能。

Get the first 100 bytes of a document:
    curl -r 0-99 http://www.get.this/

Get the last 500 bytes of a document:  
    curl -r -500 http://www.get.this/

`curl` also supports simple ranges for FTP files as well.
Then you can only specify start and stop position.

Get the first 100 bytes of a document using FTP:
    curl -r 0-99 ftp://www.get.this/README
它即使用于部署在GigaSpaces上的Java Web应用程序也能正常工作。

4
请注意,服务器必须支持此选项。 - Kyle Crawford

17
curl <url> | head -c 499
或者
curl <url> | dd bs=1 count=499

应该这样做

此外,还有一些更简单的工具,可能拥有更广泛的可用性,例如

    netcat host 80 <<"HERE" | dd count=499 of=output.fragment
GET /urlpath/query?string=more&bloddy=stuff

HERE

或者

GET /urlpath/query?string=more&bloddy=stuff

2
谢谢。使用 curlGET,我们可以获取整个文档。因此,使用 ddhead,我们可以截取长度。但是,有没有可能我们不需要获取整个页面? - hahakubile
6
流媒体、UNIX哲学和管道:它们都是数据流。由于curl和GET是UNIX过滤器,如果结束接收管道(dd),将会提前终止curl或GET(SIGPIPE)。无法确定服务器是否足够智能以停止传输。但在TCP层面上,我想一旦没有更多的响应,它就会停止重试数据包。 - sehe
如果文件是二进制的,你可能想使用dd命令。dd命令默认块大小为512字节,所以如果你只想要前499个字节,你需要执行 'dd bs=1 count=499'。或者如果你只想要前512个字节,'dd count=1'就可以了。 - Adam F

2
请注意,许多HTTP/1.1服务器没有启用此功能,因此当您尝试获取范围时,您将获得整个文档。您无论如何都需要获取整个网页,因此您可以使用curl获取网页并将其传输到head中。 head命令是打印文件的前N个字节,如果带有'-',则打印每个文件除了最后N个字节。

现在,我正在使用curl | head。有没有命令可以不下载整个网页,只给出前N个字节?谢谢。 - hahakubile

0

我来这里是为了寻找一种测量服务器处理时间的方法,我认为可以通过告诉curl在下载1个字节或其他内容后停止来实现。

对我而言,更好的解决方案是进行HEAD请求,因为这通常允许服务器正常处理请求但不返回任何响应体:

time curl --head <URL>

2
许多服务器,例如Amazon S3,明确禁用HEAD请求。 - Ian Kemp

-1
建立一个套接字连接。读取你想要的字节。关闭连接,完成操作。

是的,@adymitruk,你说得对。但如果没有套接字,就没有Linux命令可以处理这些需求了吗? - hahakubile

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