【问题标题】:Urlencode with cURL in bash with newlines在带有换行符的 bash 中使用 cURL 进行 Urlencode
【发布时间】:2012-08-09 12:54:39
【问题描述】:

我正在尝试向我们的 SMS 网关发送一个请求,我想在发送的 SMS 中添加一些换行符。

到目前为止,我得到了这个:

/usr/local/bin/curl -G --data-urlencode "text=*****centreon Notification *****\n\nType:$NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\nDate/Time: $DATE$" "http://192.168.11.248:13013/cgi-bin/sendsms?username=user&password=password&from=12345678&to=87654321"

但是,这不起作用,因为我在短信中收到了所有 \n,应该有一个新行。

我有一个 PHP 脚本,\n 可以在其中工作,但由于我不能调用 PHP 脚本,所以我必须使用一个单行器来执行此操作,其中 cURL 发挥作用。

【问题讨论】:

    标签: bash curl newline


    【解决方案1】:

    您可以在 Bash 中将换行符嵌入到带引号的字符串中,这很简单。

    /usr/local/bin/curl -G --data-urlencode "text=*****centreon Notification *****
    
    Type:$NOTIFICATIONTYPE$
    Host: $HOSTNAME$
    State: $HOSTSTATE$
    Address: $HOSTADDRESS$
    Info: $HOSTOUTPUT$
    Date/Time: $DATE$" "http://192.168.11.248:13013/cgi-bin/sendsms?username=userpassword=password&from=12345678&to=87654321"
    

    尾随的美元符号应该完成什么?

    如果您愿意,Bash 有一种用于字符串转义的语法,例如 $'Hello\nworld'。注意开盘价前的美元符号。

    【讨论】:

    • 尾随的美元符号是 Nagios/Centreon 如何处理要传递给命令的参数。在 bash 中嵌入换行符效果很好 - 谢谢!
    【解决方案2】:

    您可以使用带有转义序列的$'' 风格的引号或带有文字换行符的其他引号类型将换行符添加到参数中。不过,我会更好地组织这个。那是一个非常长的“单线”。

    declare -a a=(
        $'text=*****centreon Notification *****\n'
        "Type: $NOTIFICATIONTYPE"
        "Host: $HOSTNAME"
        "State: $HOSTSTATE"
        "Address: $HOSTADDRESS"
        "Info: $HOSTOUTPUT"
        "Date/Time: $DATE"
    )
    
    url=http://192.168.11.248:13013/cgi-bin/sendsms?username=user&password=password&from=12345678&to=87654321
    
    /usr/local/bin/curl -G --data-urlencode "$(printf '%s$\n' "${a[@]}")" "$url"
    

    顺便说一句,ksh 现在通过 printf '%(url)q' '...data...' 原生支持 URL 编码,在这种情况下可能根本不需要 curl。

    【讨论】:

    • 嗯,你的脚本看起来不错,虽然我不能使用这么长的脚本(有多个操作符),因为它必须进入一个 nagios 配置文件。
    • @FrederikNielsen 啊,两者都可以。这更适合用作更大的 Bash 脚本的一部分。
    【解决方案3】:

    Nagios 不接受 command_line 参数中的多行值,因此您可以执行以下操作:

    /usr/local/bin/curl "http://192.168.11.248:13013/cgi-bin/sendsms?username=userpassword=password&from=12345678&to=87654321&text=%2A%2A%2A%2A%2Acentreon%20Notification%20% 2A%2A%2A%2A%2A%0A%0AType:%20$NOTIFICATIONTYPE$%0AHost:%20$HOSTNAME$%0AState:%20$HOSTSTATE$%0AAddress:%20$HOSTADDRESS$%0AInfo:%20$HOSTOUTPUT $%0AD日期/时间:%20$DATE$"

    【讨论】:

    • 其实这不是一个好的解决方案,因为这样nagios宏($$之间的变量)不会被URLencoded。
    • 我在这里放了一个包装脚本zszsit.blogspot.com/2014/03/… 它适用于nagios/icinga 和kannel
    猜你喜欢
    • 2021-03-10
    • 1970-01-01
    • 2010-09-22
    • 2018-11-14
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    相关资源
    最近更新 更多