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

在bash脚本中通过curl登录失败,同一个curl在命令行上成功,bash,curl,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&a

我在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上运行它时,它成功了。

大多数问题在于如何引用/不引用变量和子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

通过运行脚本也有助于解决类似问题。

BTW,字符串相等运算符为=,而不是==后者是一种误导,试图通过发出有关无效运算符的错误消息来减轻程序员的负担。@Jens:在什么情况下,在比较两个字符串时使用==会实际失败?只是好奇真的。。。thanks@l我想这只是为了POSIX的兼容性。在我的系统上,所有Bash内置的[[,[and test]以及/usr/bin/test和/usr/bin/[都不会抱怨==,即使Bash处于-posix模式。不过,Dash也会抱怨[blah==blah]意外的运算符。@l'l'l它患上了all-the-worlds-a-bash或Linux综合症并失败,例如在FreeBSD、Solaris和SunOS上;可能还有其他系统和Shell。没有合理的理由选择==,除非您认为不必要的未来破坏是一项功能。问题不是它与401不匹配,而是运行相同的curl脚本中的ogin命令无法进行身份验证,而当我在实际CL上运行它时,它会成功。因此,如果不选择此命令作为最佳答案,我会在脚本或命令行中得到相同的结果,因此这显然是在您的环境中表现出来的。我无法告诉您为什么会看到不同的结果,但我t与我的答案无关,因此,由于不够清晰,因此对您的问题进行了否决。另外请注意,您在编辑中使用的curl命令url语法与最初在脚本中发布的语法不同。您应该尝试将其更改为$curl-w%{http_code}-s-o/dev/null-data username=$username&password=$password-H'主机:stage.mysite.it''http://stage.mysite.it:9301/login“-k,看看有没有区别。