如何使此脚本捕获它返回的错误类型(500,503,402 等)并将其添加到消息中?
#!/bin/bash
hostlist=(s-colin.coverhound.us s-joe.coverhound.us)
for host in "${hostlist[@]}"; do
if nc -w 2 -z $host 80; then
echo "INFO: ssh on $host responding [Looks Good]"
else
echo "ERROR: ssh on $host not responding[Ooops something went
wrong]"
fi
done
答案1
您当前的脚本不执行 HTTP 请求,因此没有 HTTP 响应,因此没有要报告的 HTTP 结果代码。nc -z
只是尝试建立 TCP 连接,然后立即退出并告诉您是否成功。一个合适的 HTTP 客户端不会这样做;一旦建立 TCP 连接,它就会发送有效的 HTTPGET
或POST
请求,并等待服务器对其的响应,然后以某种方式将其报告给用户。
您可能应该在脚本中添加另一个操作以使用例如curl
测试nc
成功进行连接。到底要测试什么还不太清楚,但通常要检查的是获取起始页是否有效。
if curl -s http://$host/ >/dev/null; then
echo "INFO: fetching http://$host/ worked" >&2
else
rc=$?
echo "ERROR: fetching http://$host/ failed (curl exit code $rc)" >&2
exit $rc
fi
仍然存在不会返回特定 HTTP 结果代码的失败场景,因此我不想将其放入其中。如果您需要它,那么curl
在可用时报告它并不难。
最重要的是,您需要了解您正在测试的内容,以及完整的 HTTP 事务在网络级别上是什么样子(如果这就是您想要测试的内容)。
另请注意,诊断输出将转至标准错误(重定向>&2
)。
用 shell 脚本编写正确的网络测试脚本是一件苦差事,因为有很多事情可能会出错。是否至少有一个物理网络设备?电缆是否已插入?有到网络的路由吗?我们可以解析远程主机的名称吗?我们可以在给定端口上连接到它吗? (您当前的脚本对此进行了测试。)接收该连接的任何内容是否都遵循预期的协议?它能处理一个简单的请求吗?它是否处理特定的重要请求?处理是否正确 - 服务器端和客户端收到的响应的结果是否符合我们的预期? (例如,如果后端有一个数据库保存状态,它的状态现在是否不同,在仅有的我们正在测试的一方面?)
一个常见的烦恼是测试GET /static-page
但没有发现你想要的东西真的想要工作的是返回 500 服务器错误,但是POST /dynamic-content
测试有效负载太难或太繁琐而无法自动化,所以您从未这样做过。