我在我的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上。
答案 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运行脚本也有助于解决此类问题。