【问题标题】:Error with JSON and Shell ScriptJSON 和 Shell 脚本出错
【发布时间】:2017-03-19 06:06:08
【问题描述】:

我尝试使用 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" : "新票","pretext": "来自 my@email.com 的新票","title": "Prueba' de Notificación '6","title_link": "http://site/otrs/index.pl?Action=AgentTicketZoom;TicketID2016110472000067" “文本”:“塞拉多”,“颜色”:“#006495”}]}'https://hooks.slack.com/ curl:(6)无法解析主机:de curl:(6)无法解析主机:xn--notificacin-zeb curl:(3)[globbing]第152列中不匹配的右大括号/括号

我不明白为什么变量 $title 的结果显示 "Prueba' de Notificación '6"

如果我用 echo 打印 $title 变量,我会得到:"Prueba de Notificación 6" 在第一个空格之前和最后一个空格之后没有简单的引号。

我能做什么?

【问题讨论】:

  • 此代码中存在严重的、影响安全的错误。如果有人给出1' OR '1' == '1 的票号或'; DROP TABLE ticket; -- 的票号,你认为会发生什么?
  • 为了安全地形成 JSON,而不是字符串连接(这使您负责正确引用),请使用理解语法的工具,例如 jq
  • ...对于 shell 端的其他错误,请参阅 shellcheck.net

标签: json shell curl sh slack


【解决方案1】:

首先:此代码作为一个整体已损坏,无法修复。不要在生产中使用它。用你真正擅长的语言重写它(并且有支持绑定变量的 SQL 库,这样你就可以修复你的安全错误,以及确保内容总是被正确引用的 JSON 库),而不是 shell。


也就是说,至于你眼前的问题--

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

"title": "'$title'",

...您正在扩展 $customer 未引用,这意味着扩展值内的空格用于 shell 的分词和全局扩展。

改为:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2016-04-04
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多