Я создаю веб-сайт, который позволяет пользователям заполнять форму, отправляющую электронное письмо на сервер. Тема письма создается как серверный сценарий, который я хотел бы запустить в командной строке сервера, чтобы автоматизировать процесс. В настоящее время команды выполняются вручную, я копирую отформатированную тему и запускаю ее в Терминале. Может кто-то указать мне верное направление? Я прочитал несколько сообщений на 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
Чем больше условий и чем более конкретные условия вы можете установить для защиты, тем меньше риск того, что это может быть использовано. Я все еще очень не решаюсь поставить это на рабочий сервер. Если вы можете поставить условие, чтобы разрешить только несколько очень специфических команд (нет rm
нет cat
нет ls
нет 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
со специальным оператором регулярного выражения \/
и мы довольно причудливо перенаправляем входящее сообщение команде, которая просто игнорирует его стандартный ввод (мы в основном запускаем его для побочных эффектов). Это случайно заставит Procmail считать сообщение доставленным; добавить c
флаг, чтобы избежать этого (:0c
).
Многие примеры Procmail допускают использование произвольных пробелов после Subject:
двоеточие и т. д., но поскольку эти сообщения предположительно будут сгенерированы машиной, здесь нет необходимости.
Это не справится правильно с Заголовки в кодировке MIME RFC2047; если вам это нужно, вам нужно будет добавить этап декодирования (однострочный Perl?)