Ответ 1
Используйте require 'shellwords'
и Shellwords.escape
, которые помогут вам в этом:
Хорошо, это сводит меня с ума:
`ls #{"/media/music/Miles Davis"}`
не удается из-за пробела между "Miles" и "Davis"
Скажем, я пишу ruby script, и пользователь передает путь к файлу в качестве аргумента. Как я могу сбежать от него и выполнить команду shell-out. Да, да, я знаю, следует избегать обстрелов. Но это надуманный пример, мне все еще нужно это.
Я бы сделал system("ls", ARGV[0])
, но он не возвращает вывод stdout из ls в виде строки, что и делает backticks.
Как избежать того, что вы вставляете в оболочку?
Используйте require 'shellwords'
и Shellwords.escape
, которые помогут вам в этом:
Держитесь подальше от создания строк оболочки, когда это возможно, это прекрасный вектор для произвольного выполнения кода.
В этом случае вы можете использовать popen
, который выполняет экранирование для вас:
IO.popen(['printf', 'a b']) do |f|
var = f.read
end
Двойные кавычки также работают:
`ls "#{'/media/music/Miles Davis'}"`
или
`ls "#{ARGV[0]}"`