通过curl登录在bash脚本中失败,同样的curl在命令行上成功

时间:2017-04-27 20:04:30

标签: bash curl

我在我的bash脚本中通过curl运行此登录。我想确保在执行脚本的其余部分之前可以登录,在那里我实际登录并将cookie存储在cookie jar中,然后在API中执行数千次的另一个curl。如果我没有登录,我不想全力以赴。

问题是,基本登录在脚本内部运行时返回401。但是当我在命令行上运行完全相同的curl命令时,它返回200!

basic_login_curl="curl -w %{http_code} -s -o /dev/null -X POST -d \"username=$username&password=$password\" $endpoint/login"
echo $basic_login_curl
outcome=`$basic_login_curl`
echo $outcome
if [ "$outcome" == "401" ]; then
    echo "Failed login. Please try again."; exit 1;
fi

输出:

curl -w %{http_code} -s -o /dev/null -X POST -d "username=bdunn&password=xxxxxx" http://stage.mysite.it:9301/login
401
Failed login. Please try again.

复制输出并在cmd行上运行:

$ curl -w %{http_code} -s -o /dev/null -X POST -d "username=bdunn&password=xxxxxx" http://stage.mysite.it:9301/login
200$

有什么想法吗? LMK,如果您需要查看的代码中有更多内容。

ETA:请注意:问题不在于它与401不匹配,在脚本中运行相同的curl login命令无法进行身份验证,而在运行时它会成功它在实际的CL上。

1 个答案:

答案 0 :(得分:2)

大多数问题在于如何引用/不引用变量和子shell执行。我建议您按照以下方式设置命令:

basic_login_curl=$(curl -w "%{http_code}" -s -o /dev/null -X POST -d "username=$username&password=$password" "$endpoint/login")

其余基本上涉及正确引用所有内容:

basic_login_curl=$(curl -w "%{http_code}" -s -o /dev/null -X POST -d "username=$username&password=$password" "$endpoint/login")
# echo "$basic_login_curl" # not needed since what follows repeats it.
outcome="$basic_login_curl"
echo "$outcome"
if [ "$outcome" = "401" ]; then
    echo "Failed login. Please try again."; exit 1;
fi

通过shellcheck.net运行脚本也有助于解决此类问题。