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

时间:2017-11-22 21:04:01

标签: linux bash http netcat

我编写了以下脚本(它还不支持索引)。我遇到的问题是关于使用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

2 个答案:

答案 0 :(得分:0)

您需要将请求标头传递给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

答案 1 :(得分:0)

nc的工作原理是将标准输入复制到给定地址: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 $ path may containsigns and that would confuse printf`。