2016-11-05 2 views
0

Я попытался сделать слабину с помощью сценария оболочки.Ошибка с JSON и Shell Script

Параметры 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: приложения/JSON' --data «{ "имя пользователя": "OTRS",» «...»: «slackusr:», «attachments»: [{«fallback»: «New Ticket», «pretext»: «Новый билет с [email protected]», «title»: «Prueba 'Notificación' 6 "," title_link ":" http://site/otrs/index.pl?Action=AgentTicketZoom;TicketID2016110472000067 "," text ":" Cerrado "," color ":" # 006495 "}]} 'https://hooks.slack.com/ curl: (6) Не удалось решить хост: de curl: (6) Не удалось разрешить хост: xn - notificacin-zeb curl: (3) [подстановка] непревзойденная закрывающая фигурная скобка/скобка в колонке 152

Я не понимаю, почему результат переменных $ заголовка показывает, что «Prueba„де Notificación“6"

Если я печатаю $ название переменной с эхом. Я получаю: «Prueba de Notificación 6» без простых кавычек перед первым пространством и после последнего пробела.

Что я могу сделать?

+1

В этом коде есть серьезные ошибки, влияющие на безопасность. Как вы думаете, что произойдет, если кто-то даст номер билета '1 'ИЛИ' 1 '==' 1' или номер билета' '; DROP TABLE билет; --'? –

+1

Что касается безопасного формирования JSON, а не конкатенации строк (что делает вас ответственным за правильное цитирование), используйте инструмент, например 'jq', который понимает синтаксис. –

+1

... и для других ошибок на стороне оболочки, см. Http://shellcheck.net/ –

ответ

1

Первый: этот код, в целом, нарушен без ремонта. Не используйте его в производстве. Перепишите его на языке, на котором вы действительно хороши (и в нем есть библиотеки SQL, которые поддерживают переменные связывания, чтобы вы могли исправить ошибки безопасности и библиотеки JSON, которые гарантируют, что контент всегда правильно цитируется), а не оболочка.


Тем не менее, как и для вашей насущной проблемы -

Всякий раз, когда вы делаете это в одинарных кавычках контекста:

"title": "'$title'", 

... вы расширяющаяся $customerнеупомянута , что означает, что пространства внутри расширенного значения используются для расщепления слов и расширения glob оболочкой.

Вместо этого, сделать это:

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

... открытие двойных кавычками контекста после завершения одного цитируемого контекста.

Смежные вопросы