Bash Can';t在递归shell函数中生成curl POST。。?

Bash Can';t在递归shell函数中生成curl POST。。?,bash,shell,curl,recursion,Bash,Shell,Curl,Recursion,我试图对URL进行curlPOST,这可能会导致一系列重定向(301)到受基本身份验证保护的实际URL。事实证明,-L选项在这种情况下没有多大帮助,我想我应该尝试用递归函数编写一个特定于案例的shell脚本,以证明这个概念。以下是脚本: #!/bin/sh WORK_DIR=/some/dir MY_URL=http://redirect.me/some/service MY_FILE=output.bin follow_redirect() { echo "Input URL is $1

我试图对URL进行
curl
POST,这可能会导致一系列重定向(301)到受基本身份验证保护的实际URL。事实证明,
-L
选项在这种情况下没有多大帮助,我想我应该尝试用递归函数编写一个特定于案例的shell脚本,以证明这个概念。以下是脚本:

#!/bin/sh

WORK_DIR=/some/dir
MY_URL=http://redirect.me/some/service
MY_FILE=output.bin

follow_redirect() {

echo "Input URL is $1"

local status_code="$(curl -s -X POST --data-binary @${WORK_DIR}/postdata.txt -u myuser:mypass \
-o ${WORK_DIR}/${MY_FILE} -D ${WORK_DIR}/headers.out -w "%{http_code}" "$1" --header "X-Custom-Header:Whatever")"

echo "Status code is $status_code"

if [ $status_code -eq "301" ]; then
  # extract Location header value
  local loc_line="$(cat ${WORK_DIR}/headers.out | grep Location)"
  local sub_url=${loc_line:10}
  echo "HTTP redirect to: $sub_url"
  follow_redirect "$sub_url"
elif [ $status_code -eq "200" ]; then
  echo "HTTP OK"
  return
else
  echo "HTTP request failed"
  return
fi

}

# do the call
follow_redirect "$MY_URL"
简短描述:想法是尝试拨打电话,并获取状态码。如果代码为301,则执行递归调用,传入以前从
位置
头提取的新URL(可以看到,头被转储到临时文件)

我得到的输出是:

Input URL is http://redirect.me/some/service
Status code is 301
HTTP redirect to: http://actual.url/some/service
Input URL is http://actual.url/some/service
Status code is 000
HTTP request failed

出于某种原因,第一个递归的
curl
调用失败,状态代码为
000
,好像我传入了一个空的输入URL或其他东西(但输入URL实际上打印正确)。我还尝试用硬编码的值替换所有参数化的文件系统路径,以确保它不存在,但结果是相同的。你知道我做错了什么吗?

事实上,仅仅使用
curl
似乎就解决了这个问题,不仅指定了
--位置受信任的
,而且还指定了
--post301
,以便保留原始的POST请求,这样它就不会被转换为重定向后的get。
–Less

@4ae1e1您是否注意到我上面的评论,
-L
在这种情况下不起作用(需要身份验证)
curl
似乎没有传播auth.dataHmm。。。我没有试过。我来试试。进一步检查后,您可能应该使用
--location trusted
而不是
-L
--location
。Ref:.实际上,似乎通过使用
curl
解决了这个问题,不仅指定了
--location trusted
,而且还指定了
--post301
,以便保留原始的POST请求,这样它就不会在重定向时转换为get。请随意根据您的评论撰写答案,我会接受。是的,这也在手册页的
-L,--location
下;我不知道,因为我从来没有相关的用例。我通常不愿意写直接引用答案的琐事,所以你可以自己写出来。