2010-01-29 4 views
3

У меня есть сценарий, который можно назвать ненадежными пользователями, мы должны сделать вызов по линиям этого составил пример:Как отключить разрушение выполнения системной команды

system 'somescript ' + data 

Нам необходимо обеспечить, если data == 'filename; dosomethingelse' затем; экранируются (или любой другой специальный символ. В результате команда оболочки запуск фактически somescript filename\;\ dosomethingelse или somescript "filename; dosomethingelse"

Есть стандартный способ сделать это?

ответ

6
system 'somescript', data 

Multi-аргумент вызовы system не передается . к корпусу для обработки

+2

В совершенно ином примечании он напоминает мне вопросы, когда люди спрашивают, как избежать строк, чтобы они были безопасны для использования в качестве строкового литерала SQL ... правильный ответ «не нужно»; подготовленные заявления - правильный путь. Точно так же правильный способ сделать строки безопасными в качестве аргументов программы - не позволить им приблизиться к оболочке. :-P –

+1

Или как анализировать HTML с помощью регулярных выражений. http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

1

модуль Shellwords (часть стандартной библиотеки) будет делать соответствующий побег для команд оболочки:

#!/usr/bin/ruby1.8 

require 'shellwords' 

command = ['cat', 'filename with spaces', '"quoted_filename"'].shelljoin 
puts command # => cat filename\ with\ spaces \"quoted_filename\" 
system(command) 
# => this file has spaces in its name 
# => this file has a quoted filename 

shellwords также добавляет метод shellescape для String.

Эти методы не указаны в online API documentation. Они частично документированы в 1.9 Pickaxe и, как известно, присутствуют в МРТ 1.8.7. Фактический файл (на моем ящике, в /usr/lib/ruby/1.8/shelljoin.rb) хорошо прокомментирован.

Смежные вопросы