Ruby escape аргумент ARGV или строка в качестве аргумента для команды оболочки - PullRequest
26 голосов
/ 03 августа 2011

Хорошо, это сводит меня с ума:

`ls #{"/media/music/Miles Davis"}`

терпит неудачу из-за пробела между "Милями" и "Дэвисом"

Скажем, я пишу скрипт ruby, и пользователь передает путь к файлу в качестве аргумента. Как мне избежать этого и передать в командную оболочку. Да, да, я знаю, следует избегать обстрелов. Но это надуманный пример, мне все еще нужно это.

Я бы сделал system("ls", ARGV[0]), но он не возвращает вывод stdout команды ls в виде строки, что хорошо для обратных галочек.

Как избежать того, что вы вставляете в оболочку?

Ответы [ 3 ]

51 голосов
/ 03 августа 2011

Используйте require 'shellwords' и Shellwords.escape, которые исправят такие вещи для вас:

http://apidock.com/ruby/Shellwords/shellescape

6 голосов

Держитесь подальше от построения строк оболочки , когда это возможно, это точный вектор для выполнения произвольного кода.

В этом случае вы могли бы использовать popen, что делает экранирование для вас:

IO.popen(['printf', 'a b']) do |f|
  var = f.read
end
0 голосов
/ 06 сентября 2013

Двойные кавычки также работает:

`ls "#{'/media/music/Miles Davis'}"`

или

`ls "#{ARGV[0]}"`
...