Bash和curl脚本问题
我试图在bash脚本中包含此curl命令(到Dropbox audit api):Bash和curl脚本问题,bash,curl,Bash,Curl,我试图在bash脚本中包含此curl命令(到Dropbox audit api): curl -X POST https://api.dropboxapi.com/2/team_log/get_events --header 'Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXX' --header 'Content-Type: application/json' --data '{"time":{"start_time":"2018-07-16T18:07:
curl -X POST https://api.dropboxapi.com/2/team_log/get_events --header 'Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXX' --header 'Content-Type: application/json' --data '{"time":{"start_time":"2018-07-16T18:07:56Z"}}'
我已经用XXXXX等替换了身份验证令牌
在我的脚本中,时间戳实际上是一个名为$LAST的变量
我按照如下方式构建curl命令:
LAST=$(date +"%Y-%m-%dT%H:%m:%SZ")
DROPBOX1=$(echo 'curl -X POST https://api.dropboxapi.com/2/team_log/get_events --header '\''Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXX'\'' --header '\''Content-Type: application/json'\'' --data '\''{"time":{"start_time":"')
DROPBOX2=$(echo '"}}'\''')
CURLSTRING=$DROPBOX1$LAST$DROPBOX2
echo $CURLSTRING
$CURLSTRING
我以这种方式构建它,否则$LAST是有问题的,因为curl帖子中有所有的单引号和双引号
运行该小脚本可获得以下输出:
curl -X POST https://api.dropboxapi.com/2/team_log/get_events --header 'Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXXX' --header 'Content-Type: application/json' --data '{"time":{"start_time":"2018-07-16T18:07:56Z"}}'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 175 0 127 100 48 232 87 --:--:-- --:--:-- --:--:-- 231
curl: (6) Could not resolve host: Bearer
curl: (6) Could not resolve host: XXXXXXXXXXXXXXXXXXXXXXXXX'
curl: (6) Could not resolve host: application
正如可以看到的那样,脚本中的echo命令显示了一个看起来完全有效的curl命令——事实上,如果我剪切并通过该输出到命令行,它就会工作。但是,正如bash脚本本身的其余输出所示,curl命令没有得到正确的解释
我一辈子都搞不懂为什么会这样。显然,echo正确地保留了字符串,而curl命令以某种方式分解了$CURLSTRING。很明显,我没有正确地使用单引号和双引号的组合,但确切地说,在什么地方出现了中断还不清楚
谢谢
Rob您不能安全地将任意列表(如命令行参数列表——每个参数都是一个单独的字符串)存储在字符串变量中(本质上只存储一个字符串)。使用一个数组,如……中所示,也就是说——这根本不是特定于curl的;任何变量的无引号扩展都会执行字符串拆分和全局扩展,但如果该变量中包含的引号是语法性的,则不会对其进行解析。这是必要的——如果bash中的不可信数据可能包含任意语法,那么就不可能编写安全处理这些数据的代码。顺便说一句,
foo=$(echo'bar')
是一种非常低效的编写foo='bar'
的方法。即使命令替换没有生成外部进程,也要花费数毫秒才能运行--您正在fork()
生成子shell并捕获其输出。对于get\u事件
,您确定必须执行POST吗。可能是因为您正在传递数据-d{…}
。在脚本中运行整个命令,并通过bash-xyourscript.sh运行脚本,看看它将如何扩展变量