是否可以使用 Linux 命令仅从 HTTP 服务器读取前 N 个字节?
Posted
技术标签:
【中文标题】是否可以使用 Linux 命令仅从 HTTP 服务器读取前 N 个字节?【英文标题】:Is it possible to read only first N bytes from the HTTP server using Linux command? 【发布时间】:2011-08-12 19:59:54 【问题描述】:这是问题。
给定 url http://www.example.com,我们可以从页面中读取前 N 个字节吗?
使用wget,我们可以下载整个页面。使用curl,有-r,0-499指定前500字节。似乎解决了问题。
您还应该知道,许多 HTTP/1.1 服务器没有启用此功能,因此当您尝试获取范围时,您将获得整个文档。
在 python 中使用 urlib。类似的问题here,但根据康斯坦丁的评论,这是真的吗?
上次我尝试这种技术时失败了,因为实际上不可能从 HTTP 服务器读取指定数量的数据,即您隐式读取所有 HTTP 响应,然后才从中读取前 N 个字节。所以最后你下载了整个 1Gb 的恶意响应。
那么问题来了,我们如何在实践中从 HTTP 服务器读取前 N 个字节?
问候和感谢
【问题讨论】:
【参考方案1】:我来这里是为了寻找一种计算服务器处理时间的方法,我想我可以通过告诉 curl 在 1 个字节后停止下载来衡量。
对我来说,更好的解决方案是执行 HEAD 请求,因为这通常让服务器正常处理请求但不返回任何响应正文:
time curl --head <URL>
【讨论】:
许多服务器,例如Amazon S3,明确禁用HEAD
请求。【参考方案2】:
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
【讨论】:
谢谢。使用 curl 或 GET,我们可以得到整个文档。所以使用 dd 或 head,我们可以减少长度。但是有可能我们不需要获取整个页面吗? 流媒体。 UNIX 哲学和管道:它们是数据流。由于 curl 和 GET 是 unix 过滤器,结束接收管道 (dd) 将提前终止 curl 或 GET (SIGPIPE)。不知道服务器是否足够聪明以停止传输。但是在 TCP 级别上,我想一旦没有更多响应,它就会停止重试数据包。 如果文件是二进制文件,您可能需要使用 dd。 dd 命令默认为 512 字节的块大小,因此如果只想要前 499 字节,则需要执行 'dd bs=1 count=499'。或者如果你只想要前 512 个字节,'dd count=1' 就可以了。【参考方案3】:您可以通过下一个 curl 命令本地执行此操作(无需下载整个文档)。根据 culr 手册页:
范围 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】:您还应该知道,许多 HTTP/1.1 服务器没有这个 功能启用,这样当你 试图获得一个范围,你会改为 获取整个文档。
无论如何,您都必须获取整个网络,例如,您可以使用 curl 获取网络并将其通过管道传输到头部。
头
c, --bytes=[-]N 打印每个文件的前 N 个字节;以'-'开头,打印所有 但每个文件的最后 N 个字节
【讨论】:
现在,我正在使用 curl |头。有没有不下载整个网页的命令,只给出前 N 个字节?谢谢。【参考方案5】:建立一个套接字连接。读取你想要的字节。关闭,你就完成了。
【讨论】:
是的,你是对的,@adymitruk。但是如果没有socket,有没有linux命令可以处理这些需求呢?以上是关于是否可以使用 Linux 命令仅从 HTTP 服务器读取前 N 个字节?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以仅从 std::any 使用 std::reference_wrapper 创建 std::any?