JSON和Shell脚本出错

时间:2016-11-05 13:55:47

标签: json shell curl sh slack

我试图用shell脚本做一个松弛的通知。

JSON参数由MySql查询获取的变量形成。

#!/bin/sh
#MySQL RO Access
host='mysqlserver.com'
userdb='slackro'
password='password'
db='db'
#Slack information
hook='https://hook.slack'
user='slackusr'
channel='o_channel'
emoji='slackusr'

#Query
id=`mysql -D $db -u $userdb -p$password -e 'SELECT id FROM ticket WHERE tn ='$1'' -h $host | sed -e '1d'`
tn=`mysql -D $db -u $userdb -p$password -e 'SELECT tn FROM ticket WHERE tn ='$1'' -h $host | sed -e '1d'`
title=`mysql -D $db -u $userdb -p$password -e 'SELECT title FROM ticket WHERE tn ='$1'' -h $host | sed -e '1d' | sed "s/'/ /g" | sed "s/°//g" | sed "s/ /_/g" `
customer=`mysql -D $db -u $userdb -p$password -e 'SELECT customer_id FROM ticket WHERE tn ='$1'' -h $host | sed -e '1d'`
msj=`mysql -D $db -u $userdb -p$password -e 'SELECT a_body FROM article WHERE ticket_id ='$id' ORDER BY id DESC LIMIT 1' -h $host | sed -e '1d'`
url='http://iiabox.infra.ultra.sur.top/otrs/index.pl?Action=AgentTicketZoom;TicketID'$1

#Message
curl -X POST -H 'Content-type: application/json' --data '{"username": "slackusr","icon_emoji": ":slackusr:","attachments": [{"fallback": "New Ticket","pretext": "New ticket from '$customer'","title": "'$title'","title_link": "'$url'","text": "'$msj'","color": "#006495"}]}' $hook

当我执行这个脚本时,我获得了类似的东西

curl -X POST -H'Content-type:application / json'-- data'{“username”:“OTRS”,“icon_emoji”:“:slackusr:”,“attachments”:[{“fallback” :“新票”,“借口”:“来自my@email.com的新票”,“标题”:“Prueba'deNotificación'6”,“title_link”:“{{3} }“,”text“:”Cerrado“,”color“:”#006495“}]}'http://site/otrs/index.pl?Action=AgentTicketZoom;TicketID2016110472000067 卷曲:(6)无法解析主持人:de 卷曲:(6)无法解析主机:xn - notificacin-zeb 卷曲:(3)[第150栏] [globbing]无与伦比的紧密支撑/支架

我不明白为什么变量$ title的结果显示“Prueba'deNotificación'6”

如果我用echo打印$ title变量,我获得:“PruebadeNotificación6”,在第一个空格之前和最后一个空格之后没有简单的引号。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

首先:这个代码整体上已经超出了修复范围。不要在生产中使用它。用你真正擅长的语言重写它(并且它有支持绑定变量的SQL库,以便你可以修复你的安全漏洞,以及确保内容始终被正确引用的JSON库),而不是shell。

那就是你说的直接问题 -

每当您在单引号上下文中执行此操作时:

"title": "'$title'",

...您正在扩展$customer 不加引号,这意味着扩展值中的空格将用于shell的分词和全局扩展。

取而代之的是:

"title": "'"$title"'"

...在终止单引号上下文后打开双引号上下文。