【问题标题】:Expanding variable with spaces into a curl POST variable将带有空格的变量扩展为 curl POST 变量
【发布时间】:2011-10-03 15:26:09
【问题描述】:

一些研究揭示了一些有用的 stackexchange 帖子,即 expanding variable in CURL,但给出的答案似乎无法正确处理其中包含空格的 bash 变量。

我正在为 awk 的输出设置一个变量,将一个字符串解析为一个子字符串(实际上截断为 150 个字符)。我试图通过 curl 发布的字符串中有空格。

当我使用以下 curl 参数时,POST 变量 Body 设置为字符串中第一个空格之前的部分。

curl -X POST 'https://api.twilio.com/2010-04-01/Accounts/GUID/SMS/Messages.xml' -d 'From=DIDfrom' -d 'To=DIDto' -d 'Body="'$smsbody'" -u SECGUID

smsbody 设置为:

smsbody="$(echo $HOSTNAME$ $SERVICEDESC$ in $SERVICESTATE$\: $SERVICEOUTPUT$ | awk '{print substr($0,0,150)}')"

所以smsbody 中唯一被发布的部分是$HOSTNAME$(恰好是一个没有任何空格字符的字符串)。

我应该使用什么 curl 语法来正确嵌套 bash 变量以进行扩展,但被视为单个数据字段?

看起来很微不足道,但我在没有运气的情况下搞砸了一段时间。我认为有更好的 CLI-fu 的人可以在一秒钟内处理它。

谢谢!

【问题讨论】:

    标签: bash post curl nagios


    【解决方案1】:

    Body 之前好像多了一个单引号。您还需要双引号,否则不会评估 $smsbody。

    试试这个:

    curl -X POST 'https://api.twilio.com/2010-04-01/Accounts/GUID/SMS/Messages.xml' \
        -d 'From=DIDfrom' -d 'To=DIDto' -d "Body=$smsbody" -u SECGUID
    

    如果$s 仍然是一个问题(我不认为空格是),试试这个在他们前面加上一个\

    smsbody2=`echo $smsbody | sed 's/\\$/\\\\$/g'`
    curl -X POST 'https://api.twilio.com/2010-04-01/Accounts/GUID/SMS/Messages.xml' \
        -d 'From=DIDfrom' -d 'To=DIDto' -d "Body=$smsbody2" -u SECGUID
    

    如果我运行 nc -l 5000 并将 twilio 地址更改为 localhost:5000,我会看到 smsbody 变量正确输入。

    matt@goliath:~$ nc -l 5000POST / HTTP/1.1
    Authorization: Basic U0VDR1VJRDphc2Q=
    User-Agent: curl/7.21.6 (x86_64-apple-darwin10.7.0) libcurl/7.21.6 OpenSSL/1.0.0e zlib/1.2.5 libidn/1.20
    Host: localhost:5000
    Accept: */*
    Content-Length: 45
    Content-Type: application/x-www-form-urlencoded
    
    From=DIDfrom&To=DIDto&Body=goliath$ $ in $: 
    

    【讨论】:

    • 谢谢马特!当我尝试'Body='$smsbody' 时,curl 从字面上发送了字符串$smsbody(字面意思是不扩展变量)。我将尝试按照您的建议在使用sed 的空格字符之前将转义字符“\”添加到字符串中,看看是否可行!
    • 我刚刚进行了编辑,因此请确保您及时了解我的答案。祝你好运!
    • 这成功了!非常感谢! curl 只能在转义空格字符时扩展 curl 内的变量。我短暂地试图通过管道两次而不是设置一个额外的 bash 变量。我会单独处理这个。现在我将只使用条件&& 来(也许)在一行中执行两个命令。
    • using xargs: smsbody="$(echo $HOSTNAME$ $SERVICEDESC$ in $SERVICESTATE$\: $SERVICEOUTPUT$ | awk '{print substr($0,0,150)'} | xargs -0 -I {} echo {} | sed 's/\\$/\\\\$/g' )" 在解决这个问题时,我一直错过 curl POST 中的双引号。非常重要。
    • 还有...圣杯,所有这些都在一行中:echo $(echo $HOSTNAME$ $SERVICEDESC$ in $SERVICESTATE$\: $SERVICEOUTPUT$ | awk '{print substr($0,0,150)'} | xargs -0 -I {} echo {} | sed 's/\\$/\\\\$/g') | xargs -0 -I {} curl -X POST 'localhost:5000' -d 'From=DIDfrom' -d 'To=DIDto' -d "Body={}" -u SECGUID谁需要脚本!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 2011-05-08
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 2023-01-24
    • 2011-08-14
    相关资源
    最近更新 更多