Выполнение скрипта Bash из скрипта PHP
Я хочу выполнить скрипт Bash, присутствующий в системе, из скрипта PHP. У меня в системе есть два сценария. Одним из них является PHP скрипт под названием client.php присутствует в /var/www /html, а другой-скрипт Bash под названием testscript, присутствующий в/home / testuser.
мой клиент.PHP скрипт выглядит так:
<?php
$message=shell_exec("/home/testuser/testscript 2>&1");
print_r($message);
?>
мой testscript выглядит как
#!/bin/bash
echo "Testscript run succesful"
когда я делаю следующее в терминале
php client.php
Я получаю следующий вывод на терминале
Testscript run successful
но когда я открываю страницу в
http://serverdomain/client.php
Я получаю следующий вывод
sh: /home/testuser/testscript: Permission denied
Я получаю эту ошибку даже после того, как я сделал chmod +x testscript.
Как заставить его работать из браузера? Пожалуйста помочь.
4 ответов
у меня был бы каталог где-то под названием scripts под папкой WWW, так что он недоступен из интернета, но доступен PHP.
например /var/www/scripts/testscript
убедитесь, что пользователь/группа для testscript
совпадает с вашими веб-файлами. Например, если ваш client.php
принадлежит apache:apache
, измените скрипт bash на того же пользователя / группу, используя chown
. Вы можете узнать, что ваш client.php
и веб-файлы принадлежат doing ls -al
.
затем запустить
<?php
$message=shell_exec("/var/www/scripts/testscript 2>&1");
print_r($message);
?>
EDIT:
если вы действительно хотите запустить файл как root с веб-сервера, вы можете попробовать эту двоичную оболочку ниже. Проверить это решение для того же, что вы хотите сделать.
не зная сложности настройки, мне нравится маршрут sudo. Во-первых, вы должны настроить sudo, чтобы разрешить вашему веб-серверу sudo запускать данную команду как root. Затем вам нужно иметь скрипт, который веб-сервер shell_exec (testscript) запускает команду с sudo.
для коробки Debian с Apache и sudo:
-
настройка sudo:
-
в качестве root выполните следующие действия для редактирования новый / выделенный файл конфигурации для sudo:
visudo -f /etc/sudoers.d/Webserver
(или все, что вы хотите назвать своим файлом в
/etc/sudoers.d/
) -
добавьте в файл следующий код:
www-data ALL = (root) NOPASSWD: <executable_file_path>
здесь
<executable_file_path>
это команда, которую вы должны иметь возможность запускать как root с полным путем в его имени (скажем/bin/chown
на Чаун исполняемый). Если исполняемый файл будет выполняться с одними и теми же аргументами каждый раз, вы можете добавить его аргументы сразу после имя исполняемого файла для дальнейшего ограничения его использования.например, скажем, мы всегда хотим скопировать один и тот же файл в каталог /root/, мы напишем следующее:
www-data ALL = (root) NOPASSWD: /bin/cp /root/test1 /root/test2
-
-
изменить скрипт (testscript):
отредактируйте свой скрипт так, чтобы
sudo
появляется перед командой, которая требует привилегий root(скажемsudo /bin/chown ...
илиsudo /bin/cp /root/test1 /root/test2
). Убедитесь, что аргументы, указанные в файле конфигурации sudo, точно сопоставьте аргументы, используемые с исполняемым файлом в этом файле. Итак, для нашего примера выше, у нас было бы следующее В скрипте:sudo /bin/cp /root/test1 /root/test2
если вы все еще получаете отказ в разрешении, файл сценария и разрешения родительских каталогов могут не позволить веб-серверу выполнить сам скрипт. Таким образом, вам нужно переместить скрипт в более подходящий каталог и / или изменить разрешения скрипта и родительского каталога, чтобы разрешить выполнение www-data (user или группа), что выходит за рамки данного руководства.
помните:
при настройке sudo цель состоит в том, чтобы разрешить команду в самой ограниченной форме. Например, вместо того, чтобы разрешить общее использование cp команда, вы разрешаете только cp команда, если аргументы, скажем, / root /test1/root / test2. Это значит, что cpАргументы(и функциональность cp невозможно изменить).
Это простая проблема. Когда вы работаете с terminal, вы запускаете php-файл из terminal как привилегированный пользователь. Когда вы переходите на php из своего веб-браузера, скрипт php запускается как пользователь веб-сервера, у которого нет разрешений на выполнение файлов в вашем домашнем каталоге. В Ubuntu пользователь www-data является пользователем веб-сервера apache. Если вы находитесь на ubuntu, вам придется сделать следующее: chown yourusername: www-data / home/testuser/testscript чмод г+х / home/testuser / testscript
то, что выше, передает вам право собственности пользователя на файл и дает право собственности на него группе веб-серверов. следующая команда дает исполняемому файлу разрешение группы. Теперь в следующий раз, когда вы идете вперед и делаете это из браузера, он должен работать.
я боролся с этим вопросом в течение трех дней. Я установил разрешения для скрипта на 755. Я называл свой сценарий следующим образом.
<?php
$outcome = shell_exec('/tmp/clearUp.sh');
echo $outcome;
?>
мой сценарий был следующим.
#!bin/bash
find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;
Я не получал никакого вывода или обратной связи. Изменение, которое я сделал, чтобы запустить скрипт, заключалось в добавлении компакт-диска в tmp внутри скрипта:
#!bin/bash
cd /tmp;
find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;
Это было больше удачей, чем суждением, но теперь он работает отлично. Надеюсь, это поможет.