使用带有换行符的bash中的clenL的Urlencode

时间:2012-08-13 09:51:32

标签: bash curl newline

我正在尝试向我们的短信网关发送请求,我希望在发送的短信中添加一些换行符。

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

/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脚本,我必须使用oneliner执行此操作,其中cURL发挥作用。

3 个答案:

答案 0 :(得分:4)

你可以在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'。注意开盘前的美元符号。

答案 1 :(得分:1)

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

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。

答案 2 :(得分:0)

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$%0ADate/Time:%20$DATE$"