Запись в поток ввода-вывода в Ruby вместо очистки пользовательского ввода и отправки в оболочку? - PullRequest
0 голосов
/ 27 октября 2010

Я только что прочитал сообщение в блоге о очистке пользовательского ввода в Ruby перед отправкой его в командную строку.Автор сделал такой вывод: не отправляйте вводимые пользователем данные в командную строку.

При создании формы контакта он сказал, что узнал, что

Что мне следуетвместо этого do открывает канал для команды mail в виде потока ввода-вывода и просто записывает в него, как и любой другой дескриптор файла.

Это код, который он использовал:

open( %Q{| mail -s "#{subject}" "#{recipient}" }, 'w' ) do |msg|
  msg << body
end

(Я фактически добавил кавычки вокруг получателя - они нужны, верно?)

Я не совсем понимаю, как это работает.Может ли кто-нибудь провести меня через это?

1 Ответ

4 голосов
/ 27 октября 2010

Хорошо, я объясню это с оговоркой, что я не думаю, что это лучший способ выполнить эту задачу (см. Комментарии к вашему вопросу).

open() с трубой / вертикальной чертойтак как первый персонаж будет порождать оболочку, выполнить команду и передать свой ввод в команду через канал в стиле Unix.Например, команда unix cat file.txt | sort отправит содержимое файла команде sort.Точно так же open("| sort", 'w') {|cmd| cmd << file} возьмет содержимое переменной файла и отправит его на сортировку.(«W» означает, что он открыт для записи).

% Q () - альтернативный способ заключить в кавычки строку Ruby.Таким образом, это не мешает буквальным символам кавычек в строке, что может привести к ужасному экранированию.Таким образом, команда mail -s выполняется с темой и получателем.

Кавычки необходимы вокруг темы, потому что команда mail будет интерпретироваться оболочкой, а аргументы разделяются пробелами, поэтому, если вам нужен пробел в аргументе, вы окружаете егоцитаты.Поскольку аргумент -s предназначен для субъекта, он должен быть в кавычках, поскольку он, вероятно, будет содержать пробелы.С другой стороны, получатель является адресом электронной почты, а адреса электронной почты не содержат пробелов, поэтому в них нет необходимости.

Блок обеспечивает ввод команды по трубопроводу.Все, что вы добавляете в переменную блока (в данном случае msg), отправляется в канал.Таким образом, тело письма добавляется (через оператор <<) к сообщению и, следовательно, передается в команду mail.Unix-эквивалент выглядит примерно так: <code>cat body.txt | mail -s "subject" recipient@a.com

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