如何通过 bash 脚本使用 netcat 获取 http 状态代码

问题描述

我必须编写一个必须包含这些条件的 bash 脚本。我是新手,你能给我一个建议吗?

此脚本使用“命令和 [参数]”运行。 我将它作为变量提供给域,脚本必须使用 "nc" 获取此变量的状态代码(我没有使用 cURL)。如果状态码为 200(仅),则 bash 脚本打印 OK,否则脚本应以状态码 7 退出,屏幕上没有任何打印字。

我写了这个,但是当我使用变量时,我无法得到任何结果。

1-) 这有效(这是没有变量的,我知道谷歌回复 301,所以我写了 grep 301)

#!/bin/bash

        STATUS=`printf 'GET / HTTP/1.1\r\nHost: google.com\r\n\r\n' | nc google.com 80 | awk '{print $2}' | grep '301'`
                if [ "$STATUS" -eq 301  ]; then
                echo "OK"
                else
                exit 7
                fi

2-) 这不起作用 - 请帮助我改进此脚本。我必须用 nc 命令编写才能获取响应代码并与 200 进行比较。

#!/bin/bash

DOMAIN=google.com

        STATUS=`printf 'GET / HTTP/1.1\r\nHost: "$DOMAIN"\r\n\r\n' | nc "$DOMAIN" 80 | awk '{print $2}' | grep '301'`
                if [ "$STATUS" ]; then
                        echo "OK"
                else
                        exit 7
                fi

解决方法

如果有一个小脚本。希望有帮助。请在您的生产使用前进行测试:)

STATUS=$(printf "HEAD / HTTP/1.1\r\nUser-Agent: nc/0.0.1\r\nHost: $1\r\nAccept: */*\r\n\r\n" | nc $1 80 | sed -n 's/HTTP.* \(.*\) .*/\1/p' |grep $2)

if [ $? -eq 0 ]; then
  echo OK
else
  exit 7
fi

您的 print 命令也能正常工作:

STATUS=$(printf "HEAD / HTTP/1.1\r\nUser-Agent: nc/0.0.1\r\nHost: $1\r\nAccept: */*\r\n\r\n" | nc $1 80 | awk '{print $2}' |grep $2)

您使用的 grep 将打印 200。这意味着我们必须根据实际值检查 if 块。

我正在检查最后一个退出代码。如果 grep 命令成功 - 意味着它在 HTTP 响应代码中找到了 200 - 退出代码将为 0。

我正在发布类似 ./demo.sh nginx.org 200

的脚本