我可以使用 netcat > output.txt 保存来自服务器的整个 HTTP 响应,但是这也会保存 HTTP 响应标头,如果正文是文本,这不是问题,因为当我读取 output.txt 时我可以忽略标头。
但是,如果它是一个像图像这样的二进制文件,那么我就无法查看图像,我怎样才能使用 netcat 或其他将 netcat 的输出传输到它的命令来保存响应主体?
答案1
如上所述,wget(以及 lynx... 和 curl)可以比 netcat 做得更好,但如果您坚持这样做,您可以使用您最喜欢的脚本语言过滤掉标头。由于 http 标头以 \r\n\r\n 结尾,在类 unix 系统中(我猜您就在那里)实际上意味着“所有标头行加上仅包含 \r 的行”,这并不像乍一看那么难。
使用 gawk(是的,GNU awk!因为据我所知,其他 awk 版本不认识 RT),这可以是您的命令:
netcat ... | gawk 'NR==1,/^\r$/ {next} {printf "%s%s",$0,RT}' > something.out
如果出现“为什么不直接使用 print 而不是这种丑陋的方法?”的问题,答案是:我们不知道最后一条记录(gawk 认为是一条记录)是否以换行符结束,我们也不知道这最后一条换行符的存在是否重要。只有当它在输入中时,我们才能确定是否将其写入那里。如果不存在,则 RT 将为空,因此输出将是发送的内容,而不是更多内容。