Подтвердить что ты не робот

Ruby escape Аргумент ARGV или строка в качестве аргумента для команды оболочки

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

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

не удается из-за пробела между "Miles" и "Davis"

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

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

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

4b9b3361

Ответ 2

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

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

IO.popen(['printf', 'a b']) do |f|
  var = f.read
end

Ответ 3

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

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

или

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