Как отменить выполнение системной команды - PullRequest
3 голосов
/ 29 января 2010

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

system 'somescript ' + data

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

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

Ответы [ 2 ]

6 голосов
/ 29 января 2010
system 'somescript', data

Вызовы с несколькими аргументами system не передаются в оболочку для обработки.

1 голос
/ 29 января 2010

Модуль 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 также добавляет метод шеллескейп к String.

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

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