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

czfnxgou  于 2023-04-05  发布在  Linux
关注(0)|答案(6)|浏览(119)

这就是问题所在。
给定url * http://www.example.com *,我们可以读取页面的前N个字节吗?

  • 使用wget,我们可以下载整个页面。
  • 使用curl,有-r,0-499指定前500个字节。似乎解决了这个问题。
  • 您还应该注意,许多HTTP/1.1服务器没有启用此功能,因此当您尝试获取范围时,您将获得整个文档。
  • 在python中使用urlib。类似的问题here,但根据Konstantin的评论,这是真的吗?
  • 上次我尝试这种技术失败了,因为实际上不可能从HTTP服务器只读取指定数量的数据,即您隐式读取所有HTTP响应,然后才读取其中的前N个字节。所以最终您最终下载了整个1Gb恶意响应。*

因此,问题是我们如何在实践中从HTTP服务器读取前N个字节?
问候和感谢

r6l8ljro

r6l8ljro1#

你可以通过下面的curl命令在本机完成它(不需要下载整个文档)。根据curl手册页:
RANGES HTTP 1.1引入了byte-ranges。使用这个,客户端可以请求只获取指定文档的一个或多个子部分。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应用程序。

gpfsuwkq

gpfsuwkq2#

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
kgqe7b3p

kgqe7b3p3#

您还应该知道,许多HTTP/1.1服务器没有启用此功能,因此当您试图获取范围时,您将获得整个文档。
你将不得不得到整个网络无论如何,所以你可以得到网络与 curl 和管道它的头部,例如。
水头
c,--bytes=[-]N打印每个文件的前N个字节;以'-'开头,打印每个文件的最后N个字节以外的所有字节

yks3o0rb

yks3o0rb4#

我来这里寻找一种方法来计算服务器的处理时间,我想我可以通过告诉curl在1字节或其他时间后停止下载来测量。
对我来说,更好的解决方案是执行HEAD请求,因为这通常会让服务器正常处理请求,但不会返回任何响应体:

time curl --head <URL>
b09cbbtk

b09cbbtk5#

不完全是Linux命令,但可以使用PHP脚本和file_get_contents函数(docs here),如下所示。

<?php
file_get_contents('https://example.org', false, null, 0, 1000);
?>

上面的脚本只提取从位置0开始的前1000个字节,并终止任何进一步的下载。
然后,可以像php script.php一样执行Linux命令,假设上述脚本保存到script.php文件。
对于POST请求,可以找到here示例。

xxe27gdn

xxe27gdn6#

建立一个套接字连接。读取你想要的字节。关闭,你就完成了。

相关问题