在 bash 中使用 netcat 发出 http get 请求

Using netcat to issue a http get request in bash

我写了下面的脚本(目前还不支持索引)。我遇到的问题是关于使用 netcat 加载页面。我可以使用命令行手动执行此操作,但是当我尝试让我的脚本发出完全相同的命令时,我可以在没有错误的情况下不执行任何操作。我唯一能想到的可能是我的输出去别的地方了?

#!/bin/bash
PORT=80

while [ true ]
do
    echo "Type the address you wish to visit then, followed by [ENTER]:"
    read address
    path=${address#*/}
    domain=${address%%/*}
    nc $domain $PORT
    printf "GET /$path HTTP/1.1\n" 
    printf "Host: $domain\n" 
    printf "\n" 
    printf "\n" 
done

您需要将请求头传递给nc的标准输入。

一种方法是输入重定向:

while true
do
    echo "Type the address you wish to visit then, followed by [ENTER]:"
    read address
    path=${address#*/}
    domain=${address%%/*}
    nc $domain $PORT <<EOF
GET /$path
Host: $domain

EOF
done

nc 通过将标准输入复制到给定的 address:port,并将从那里读取的任何内容复制到标准输出。

{
  printf "GET /%s HTTP/1.1\r\n" "$path"
  printf "Host: %s\r\n" "$domain"
  printf "\r\n" 
  printf "\r\n"
} | nc "$domain" "$port"
  • HTTP 要求在每行末尾添加 \r\n。有些服务器只接受 \n,但有些服务器遵守法律条文,只接受指定的 \r\n

  • 您需要将这些行发送到 nc 的标准输入。

  • 最好用printf "Get %s HTTP/1.1\r\n" "$path" because$pathmay contain%signs and that would confuseprintf`.