LINUX.ORG.RU

Вызов shell-скрипта из php-скрипта

 , ,


0

2

Всем привет.

Хочу вызывать из php скрипт на shell с передачей переменных. В какой-то степени я это реализовал. Есть страница с формой:

<form id="form" action="form.php" method="POST">
                    <input name="name" type="text" placeholder="Ваше имя" required>
                    <input name="email" type="text" placeholder="Ваш email" required>
                    <input name="sub" type="text" placeholder="Тема" required>
                    <textarea name="message" placeholder="Сообщение" required></textarea>
                    <input name="button" type="submit" value="ОТПРАВИТЬ">
                </form>

Форма обрабатывается php скриптом:

<?php
   $name = $_POST['name'];
   $email = $_POST['email'];
   $sub = $_POST['sub'];
   $message = $_POST['message'];

  system ("NAME='$name', EMAIL='$email', SUB='$sub', MESSAGE='$message' bash /root/scripts/emailsender.sh");
?>

и этот скрипт вызывает другой скрипт, уже на shell:

#!/bin/bash
sendemail -f blabla@yandex.ru -t info@blabla.ru -u TEST -m $NAME $EMAIL $SUB $MESSAGE -s smtp.yandex.ru -xu blabla-xp Password -o tls=yes -v > /tmp/formLog

При этом многочисленными тыками я понял, что в php скрипте не выполняется именно вызов shell скрипта, переменным значения из формы присваиваются (проверено). Что допилить, чтобы оно заработало? Думаю, что кто-то упрекнет меня за такую реализацию отправки писем с сайта, ну и что, дело не в этом.

P.S. Если запустить из консоли сервера скрипт form.php, то всё отработает как надо (разве что, в таком виде будут неопределенными переменные, но не суть). Проблема именно при выполнении скрипта апачем. На сркиптах для теста права 777.

Перемещено beastie из general

Ответ на: комментарий от devl547

То есть в html форме можно указать сразу emailsender.sh?

Можешь подсказать что почитать, чтобы я понял фразу «CGI же» в данном контексте?

yellowboy
() автор топика
Ответ на: комментарий от devl547

Как из html-формы забрать переменные в shell? У PHP для этого конструкция

$_POST['name']

Для shell чё-то не нахожу пока.

yellowboy
() автор топика

Шел 17 год XXI столетия от рождества, а программисты на PHP всё так и пользовались shell скриптами (ладно не AWK) !

P.S. Если запустить из консоли сервера скрипт form.php, то всё отработает как надо

Создатели похапэ всё таки решили заткнуть дырку, видимо. Потому как в Вашем коде дыра, через которую сквозит ветрами из 90х.

Можешь подсказать что почитать

http://php.net/manual/ru/function.mail.php

robot12 ★★★★★
()

Попробуй вместо system shell_exec. Ну или можешь переписать на mail() или дернуть sendmail прямо из пхп. Использовать шелл скрипт в CGI немного упорото.

goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)
Ответ на: комментарий от yellowboy

То есть в html форме можно указать сразу emailsender.sh?

вместо action=«form.php» пишешь action=«emailsender.sh».

или сразу пишешь cgi скрипт в котором задаешь свою форму.

или, чтоб допилить свой способ добавляешь в sudoers строчку с именем процесса, который открывает твой php, например

nginx ALL=NOPASSWD: ALL

а в коде делаешь так:

shell_exec("sudo /path/emailsender.sh \"$name\" \"$email\"");
в скрипте для начала проверяешь принимаются ли аргументы:
echo "Name is $1" > test.file; echo "Email is $2" >> test.file

nerve ★★
()
Ответ на: комментарий от Dred

Если он это скопипастит и вставит в его форму
в какое-нибудь поле не приходя в сознание,
то это диагноз.

Я в живую таких ещё не видел.

theanonymous
()

Кстати, ТС - для запуска внешних программ в
пхп есть удобная библиотека «symfony/process»,
там есть удобный ProcessBuilder.

theanonymous
()
Ответ на: комментарий от theanonymous

Можешь прибывать в спокойствии, «корень» чистить не собираюсь, потенциальный диагноз не катит. В живую остаётся только ждать таких персонажей.

yellowboy
() автор топика
Ответ на: комментарий от WereFox

Религия позволяет без проблем. Понял уже, что упоротый сценарий замутил, но об этом я сам в начале и писал. Самое полезное, что я понял из этого поста - видимо в PHP закрыли возможность вызова шела в том виде, в котором я хотел. Я не разработчик, ещё раз говорю, бест практисез по данному вопросу не знаю, потому и отписался сюда.

Значит, буду копать в сторону mail(). Надо только коннект настроить к smtp серверу, который будет дёргаться при использовании этой функции. Хотелось бы обойтись без sendmail локального, насколько я понимаю, это возможно, в моём случае используется smtp Яндекса.

yellowboy
() автор топика
Ответ на: комментарий от yellowboy

буду копать в сторону mail()

Копай в сторону composer, packagist, phpmailer, swiftmailer.

theanonymous
()
Ответ на: комментарий от yellowboy

что ты не программист я видел, что ты не веб-макака - нет

Dred ★★★★★
()

Боже мой... Вижу две огромные ошибки. Первая - несоблюдение основного правила защиты приложения «validate input escape output», вторая - использование shell скрипта для того, что прекрасно умеет делать сам PHP. И три замечания - а не пропущена и не надобна ли возможность сложить письма в очередь, чтоб её потом обработать отдельным периодическим скриптом на сервере? Если вдруг понадобится обеспечить защиту от злоупотребления, рулить очередью намного проще, чем отдельным скриптом/скриптами. А не стоит ли саму отсылку письма положить в отдельную функцию/класс? В таком случае сильно упростится тестирование, повторное использование или будущее совершенствование функциональности. Ну и, само собой, отсылку письма я бы ограничил как минимум капчей.

anonymous
()

А вообще тебе уже всё написали, делай штатными средствами, каждый добавленный костыль(особенно такой огромный и ужасный) приведёт к появлению уязвимостей.

mahalaka ★★
()
Ответ на: комментарий от nerve

\"

Лучше сразу застрелиться. При подстановке можно выполнить любой код. При передаче параметров нужно пользоваться одинарными кавычками.

SEInterix
()
Ответ на: комментарий от theanonymous
#!/bin/bash
echo "$1"

rm разумеется не вызывал, но выполнения команд не вижу

# ./test.sh sdfsdf
sdfsdf
#./test.sh '; date; name='sf
; date; name=sf
вызов скрипта из пхп дает тот же результат
<html>
<head>
    <title>test page</title>
    <meta charset="utf-8">
    <!--<meta http-equiv="refresh" content="10">-->
    <!-- comment -->
</head>
<body>
      <form method="post">
      <label for="value">Type something: </label>
      <input type="text" id="value" name="value" size="30" value="">
      <br><br>
      <input type="submit" name="Submit" value="Submit">
      <br><br>
</body> 
</html>

<?php
if (isset($_POST['Submit'])) {
$space  = $_POST['value'];
echo "not escaped: $space<br>";
echo "escaped: ";
echo addslashes($space);
$output = shell_exec("sudo test.sh \"$space\"");
echo "<br>Output is:<pre>$output</pre><br>";
}
?>
not escaped: '; date; name='sf
escaped: \'; date; name=\'sf
Output is:

'; date; name='sf
как передать команду через форму или в параметре для скрипта, чтоб она выполнилась?

nerve ★★
()
Ответ на: комментарий от joy4eg

без него пользователь от имени которого работает веб-сервер не может запустить скрипт.

nerve ★★
()
Ответ на: комментарий от joy4eg

Скорей слышно, по запаху :)

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

reprimand ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.