Я настраиваю веб-сайт, который позволяет пользователям заполнять форму, которая отправляет электронное письмо на сервер. Тема письма создается как серверный сценарий, который я хотел бы запустить в командной строке сервера, чтобы автоматизировать процесс. В настоящее время команды выполняются вручную, я копирую отформатированную тему и запускаю ее в Терминале. Может кто-то указать мне верное направление? Я прочитал несколько сообщений на Procmail, но они все еще не понимают, как они применимы к моим текущим потребностям.
Вот что я хочу настроить. Тема электронного письма с транзакцией будет выглядеть примерно так: «cloudron clone --app store --backup latest - location site». Сервер просто берет тему как есть и запускает ее как сценарий. Сервер настроен на выполнение сценариев такого рода. Надеюсь, это понятнее.
Если заголовок Subject содержит команду, которую вы хотите запустить, вы подвергаете себя уязвимости, связанной с выполнением произвольного кода, если кто-то может узнать или угадать, как выглядит ваша электронная почта. Но что-то вроде этого:
:0
* ^From www@your\.server\.example\.net
* ^X-Secret-Header: pA$$w0rd!\?
| formail -czxSubject: | sh
Чем больше условий и более конкретных условий вы можете поставить для защиты, тем меньше риск того, что это может быть использовано. Я бы все еще очень не решался поставить это на рабочий сервер. Если вы можете поставить условие, чтобы разрешить только несколько очень специфических команд (no rm
, no cat
, no ls
, no cp
, нет sh
или su
или sudo
очевидно), затем мммогут быть.
Вот вариант, который позволяет использовать только одну конкретную команду:
:0
* ^Subject: adduser \/[a-z0-9_]+
| sqlite3 -d users -u db -e "insert into table users (name) with value ($MATCH)"
(Мой синтаксис SQL, вероятно, нестандартен; извините.)
Вот ваш пример из обновленного вопроса:
:0
* ^Subject: \/cloudron clone --app store --backup latest —location [a-z0-9]+
| $MATCH </dev/null
... или, возможно, лучше с точки зрения безопасности, чтобы разрешить только параметр указано:
:0
* ^Subject: cloudron clone \/[a-z0-9]+
| cloudron clone --app store --backup latest --location "$MATCH" </dev/null
Эти примеры демонстрируют, как захватить что-то в MATCH
с помощью специального оператора регулярного выражения \ /
, и мы довольно причудливо перенаправляем входящее сообщение в команду, которая просто игнорирует его стандарт input (мы в основном запускаем его для побочных эффектов). Это случайно заставит Procmail считать сообщение доставленным; добавьте флаг c
, чтобы избежать этого (: 0c
).
Многие примеры Procmail допускают произвольные пробелы после Subject:
двоеточие и т. д., но поскольку эти сообщения предположительно будут сгенерированы машиной, что здесь излишне усложняется.
Это не будет правильно работать с заголовками, закодированными в MIME RFC2047 ; если вам это нужно, вам нужно будет добавить этап декодирования (однострочный Perl?)