我正在curl
Linux的命令行上使用,以发出HTTP请求。响应主体被打印为标准输出,这很好,但是我无法从手册页中看到如何卷曲来从响应中打印HTTP状态代码(404、403等)。这可能吗?
curl -IL http://www.example.com | grep "^HTTP\/"
?
我正在curl
Linux的命令行上使用,以发出HTTP请求。响应主体被打印为标准输出,这很好,但是我无法从手册页中看到如何卷曲来从响应中打印HTTP状态代码(404、403等)。这可能吗?
curl -IL http://www.example.com | grep "^HTTP\/"
?
Answers:
如果 Web服务器能够响应HEAD请求(这将不会执行GET
),那么这应该对您有用:
curl -I http://www.example.org
另外,要让cURL跟随重定向(3xx状态),请添加-L。
curl -I
执行HEAD HTTP请求,对于某些Web应用程序服务器和服务的HTTP状态代码的测试可能会出现问题
head -n 1|cut -d$' ' -f2
curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
。如果重定向后需要最终状态,请添加-L来卷曲。
curl -I -X GET
将发送GET请求,但给出相同的输出。
仅显示HTTP状态代码的一种更具体的方法是:
curl -s -o /dev/null -w "%{http_code}" http://www.example.org/
在脚本中使用起来要容易得多,因为它不需要任何解析:-)
-I
可以添加该参数以提高响应负载性能。该参数仅请求响应的状态/标题,而无需下载响应正文。
注意: %{http_code}
在HTTP有效负载的第一行返回
即:
curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/
/dev/null
东西甚至可以在我使用的Windows版本的curl中使用。
httping -c 1 -s -G -m
发出GET并不会下载整个文件,尽管我意识到这个问题专门与curl有关。
-s
=不显示下载进度,-o /dev/null
=不显示正文,-w "%{http_code}"
=退出后将HTTP响应代码写入stdout。
如果要查看标题和结果,可以使用详细选项:
curl -v http://www.example.org
curl --verbose http://www.example.org
状态将显示在标题中。例如
< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity
如果要捕获变量中的HTTP状态代码,但仍将内容重定向到STDOUT,则必须创建两个STDOUT。您可以使用进程替换>()和命令替换$()来实现。
首先,使用3
为当前进程的STDOUT 创建文件描述符exec 3>&1
。
然后,用卷曲的-o
选项,使用重定向命令替换响应内容到一个临时FIFO,然后将该命令替换内,输出重定向回你的当前进程STDOUT文件描述符3
用-o >(cat >&3)
。
全部放在一起bash
3.2.57(1)-release
(的标准配置macOS
):
# creates a new file descriptor 3 that redirects to 1 (STDOUT)
exec 3>&1
# Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS
# and sending the content to this command's STDOUT with -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')
请注意,这无法/bin/sh
按照SamK在下面的注释中指出的那样进行。
STDOUT
,因此您应该能够像常规命令一样将命令的输出重定向到所需的任何位置。我还没有测试过。
重新定义curl输出:
curl -sw '%{http_code}' http://example.org
可以与任何请求类型一起使用。
这是一个痛苦的curl --fail
局限。来自man curl
:
-f,--fail(HTTP)在服务器错误时静默失败(根本没有输出)
但是无法在标准输出中同时获取非零返回码和响应主体。
根据pvandenberk的回答以及在SO上学到的另一个非常有用的技巧,这里有一个解决方法:
curl_with_error_code () {
_curl_with_error_code "$@" | sed '$d'
}
_curl_with_error_code () {
local curl_error_code http_code
exec 17>&1
http_code=$(curl --write-out '\n%{http_code}\n' "$@" | tee /dev/fd/17 | tail -n 1)
curl_error_code=$?
exec 17>&-
if [ $curl_error_code -ne 0 ]; then
return $curl_error_code
fi
if [ $http_code -ge 400 ] && [ $http_code -lt 600 ]; then
echo "HTTP $http_code" >&2
return 127
fi
}
此函数的行为与完全相同curl
,但是curl
如果HTTP代码范围为[400,600 [。
这将向url发送一个请求,仅获取响应的第一行,将其拆分为块,然后选择第二行。
它包含响应代码
curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
对于POST请求,以下工作:
curl -w 'RESP_CODE:%{response_code}' -s -X POST --data '{"asda":"asd"}' http://example.com --header "Content-Type:application/json"|grep -o 'RESP_CODE:[1-4][0-9][0-9]'
使用以下cURL命令并将其通过管道传递给grep,如下所示:
$ curl -I -s -L http://example.com/v3/get_list | grep“ HTTP / 1.1”
每个标志的作用如下:
-I
:仅显示响应标题-s
:静音-不显示进度栏-L
:跟随Location:
标题这是指向HTTP状态代码的链接。
从命令行运行。该curl在静默模式下运行,跟随任何重定向,获取HTTP标头。grep将HTTP状态代码输出到标准输出。
curl -so -i /dev/null -w "%{http_code}" http://www.any_example.com
这将返回以下信息:
有关如何使用响应代码的示例。只有在地理数据库已更改(-z
)和以下重定向(-L
)的情况下,我才使用它重新下载它们:
url=http://example.com/file.gz
file=$(basename $url)
response=$(curl -L -s -o $file -z $file $url -w "%{http_code}")
case "$response" in
200) do_something ;;
301) do_something ;;
304) printf "Received: HTTP $response (file unchanged) ==> $url\n" ;;
404) printf "Received: HTTP $response (file not found) ==> $url\n" ;;
*) printf "Received: HTTP $response ==> $url\n" ;;
esac
OP希望知道状态码。通常,在下载文件时,您还希望了解它的大小,因此我首先使用curl来显示状态代码和文件大小,然后关闭详细信息并将文件定向到我想要的位置和名称:
curl -R -s -S -w "\nhttp: %{http_code} %{size_download}\n" -o /Users/myfiles/the_local_name.html http://archive.onweb.com/the_online_name.html
然后我等待卷发的完成
wait ${!}
在运行下一个命令之前。上面的代码在上面的许多命令的脚本中使用时,给出了很好的响应,例如:
http:200 42824
http:200 34728
http:200 35452
请注意,curl中的-o必须紧随文件的完整路径+文件名。这样,当您使用curl进行d / l处理时,便可以将文件保存为合理的名称结构。还要注意,-s和-S一起使输出静音,但确实显示错误。还请注意,-R尝试将文件时间戳设置为Web文件的时间戳。
我的答案基于@pvandenberk最初建议的内容,但除此之外,它实际上将文件保存在某处,而不仅仅是指向/ dev / null。
将输出内容拆分为stdout
,将HTTP状态代码拆分为stderr
:
curl http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2
如果stderr只需要HTTP状态代码,--silent
则可以使用:
curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2
然后,可以通过将不需要的流重定向到来选择所需的流/dev/null
:
$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 1>/dev/null
200
$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 2>/dev/null
<!doctype html>
...
请注意,为了使第二种重定向能够按预期运行,我们需要在子shell中运行curl命令。
bash
流程替代。