Правильно экранируйте json для вызова командной строки в Ruby или Rails - PullRequest
0 голосов
/ 30 января 2019

Я бы хотел вызвать утилиту командной строки из сценария ruby ​​следующим образом:

#!/env/ruby
json = {"key" => "value that \"has\" quotes"}.to_json
`aws events put-targets --cli-input-json #{json}`

, чтобы результирующий вызов выглядел следующим образом:

aws events put-targets --cli-input-json "{\"key\": \"value that \"has\" quotes\"}"

ОднакоВ результате этой строковой интерполяции получается чистая структура json без кавычек, что приводит к ошибке в командной строке.Например.

aws events put-targets --cli-input-json {"key": "value that \"has\" quotes"}

Мне нужно правильно экранировать все кавычки, чтобы строку в командной строке можно было проанализировать как правильный json.

Я пытался выполнять манипуляции со строками, чтобы вручную экранировать кавычки с такими вещами, как:

json.gsub(/\"/,'\"')

Но это тоже не работает.

Кажется, это сложнее, чем должно быть.Как я могу отрисовать правильно экранированную строку json в вызове командной строки?

У меня есть среда rails, через которую я могу выполнить это, если есть утилиты, которые ActiveSupport предоставляет, чтобы облегчить это.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Благодаря @ mu-is-too-short я наткнулся на Shellwords, которая представляет собой полезную утилиту.Это, однако, не решило проблему, но привело меня к поиску «shell escape json», которое, в свою очередь, привело меня к: Лучший способ избежать и удалить строки в Ruby?

Итак:

json = {"key" => "value that \"has\" quotes"}.to_json.dump

Правильно получает экранированную строку, которую bash поймет.Тада.

ОБНОВЛЕНИЕ: не используйте это в рабочем коде.Вам лучше следовать советам @ mu-is-too-short в комментариях или использовать библиотеку более высокого уровня.

0 голосов
/ 31 января 2019

В этом случае проще и эффективнее сделать системный вызов без оболочки.Если вы используете форму с несколькими аргументами Kernel#system для прямого вызова внешней команды:

system('aws', 'events', 'puts-targets', '--cli-input-json', json)

Без оболочки, без цитирования или экранирования проблем с json.

Если вам нужно сделать более сложные вещи (такие как вывод захвата или ошибки), посмотрите на различные методы в Open3.

Если вам абсолютно необходимо пройти через оболочкувсегда есть Shellwords.shellescape.Но на самом деле, когда вы используете оболочку, вы:

  1. Создаете командную строку с кучей строковых операций Ruby.
  2. Вызов оболочки.
  3. Позволить оболочке анализировать командную строку (т.е. отменить все, что вы сделали в (1) ).
  4. Позволить оболочке вызывать команду с вашими аргументами.

Почему бы не пойти прямо к (4) самостоятельно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...