首页 > 解决方案 > 如何通过 bash 脚本使用 netcat 获取 http 状态码

问题描述

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

此脚本使用“命令和 [参数]”运行。我将它作为变量提供给域,脚本必须使用“nc”获取此变量的状态代码(我没有使用 cURL)。如果状态码是 200(仅),bash 脚本打印正常,否则脚本应该以状态码 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

标签: linuxbashhttpcentosnetcat

解决方案


如果已经整理了一个小脚本。希望有帮助。请在生产使用前进行测试:)

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


推荐阅读