如何使用 netcat 从互联网上下载一个 URL?

如何使用 netcat 从互联网上下载一个 URL?

我可以用netcat它来在两台计算机之间传输文件。

# Server
nc -l -p 8080 < file

# client
nc 192.168.1.101 8080 > file

我可以使用netcat类似的从互联网上下载 URLwget吗?

答案1

假设您指的是常规 HTTP URL,这是可能的,但它要求您手动输入 HTTP 请求。如果 URL 需要具有 URL 编码格式的 HTTP POST 或查找特定标头,这可能会非常麻烦。

您需要向 netcat 的 stdin 提供有效的 HTTP 请求。一般思路是:

执行命令nc example.com 80

netcat 将开始从 读取stdin,并且您在终端中输入或粘贴的任何内容都将通过网络发送到您选择的端口上的远程服务器(80 是默认的 HTTP 端口)。

现在您需要输入或粘贴一个 HTTP 请求,例如:

GET / HTTP/1.1
Host: example.com
User-Agent: netcat

您还需要在末尾添加一些换行符,因此请反复按 Enter 键,直到收到 HTTP 响应。然后您必须手动解析响应。

netcat 工作在 TCP 层,因此从技术上讲,任何基于 HTTP 的协议都可以与 netcat 一起使用,但对于不适合人工输入的协议(例如 ssh 和 https),如果您没有从程序中编写脚本,则可能很难使用。如果您正在编写程序,为什么不直接使用普通的 TCP 套接字呢?

netcat 为此目的的限制如下:

  • netcat 无法理解 HTTP、FTP、HTTPS、SSH 或任何其他应用层协议。无论您使用什么脚本、程序或手动键入,该输入都必须具有足够的应用层有线协议知识,才能正确与服务器交互。
  • 即使是 HTTP 这样的简单协议也可能存在一些复杂情况,需要详细了解协议——分块编码、url 编码表单、根据提供的 cookie、用户代理等而不同的行为,以及需要成功 SSL 握手的 HTTPS。我不知道有谁能仅凭大脑手动输入 SSL 握手 :)
  • 由于 netcat 很笨,它提供如果您正在编写程序,那么使用编程式 TCP 套接字比仅使用编程式 TCP 套接字更有优势。如果您只是在终端上打字,那么使用支持适当应用层协议的程序会更容易,例如 wget、curl、lftp、ssh 等。

答案2

# create a request file
$ cat req
GET / HTTP/1.1
Host: superuser.com
User-Agent: Mozilla/5.0

# send request to get response
$ nc superuser.com 80 <req >res

相关内容