Выполнение Bash script из PHP скрипт
Я хочу выполнить Bash script в системе с PHP скрипт. У меня есть два сценария, присутствующих в системе. Одним из них является PHP скрипт, называемый client.php, присутствующий в /var/www/html, а другой - Bash script, называемый testcript, присутствующий в /home/testuser.
My client.php script выглядит как
<?php
$message=shell_exec("/home/testuser/testscript 2>&1");
print_r($message);
?>
Мой тестовый сценарий выглядит как
#!/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.
Как заставить его работать в браузере? Пожалуйста, помогите.
Ответы
Ответ 1
У меня бы был каталог где-то, называемый скриптами в папке WWW, чтобы он не был доступен из Интернета, но доступен PHP.
например. /var/www/scripts/testscript
Убедитесь, что пользователь/группа для вашего testscript
совпадает с вашими веб файлами. Например, если ваш client.php
принадлежит apache:apache
, измените bash script на одного пользователя/группу с помощью chown
. Вы можете узнать, что принадлежит вашим client.php
и веб файлам, выполнив ls -al
.
Затем запустите
<?php
$message=shell_exec("/var/www/scripts/testscript 2>&1");
print_r($message);
?>
EDIT:
Если вы действительно хотите запустить файл как root с веб-сервера, вы можете попробовать эту двоичную упаковку ниже. Проверьте это решение на то же, что вы хотите сделать.
Выполнять команды root через PHP
Ответ 2
Не зная сложность установки, мне нравится маршрут sudo.
Во-первых, вы должны настроить sudo, чтобы ваш веб-сервер мог выполнить заданную команду с правами root. Затем вам понадобится script, чтобы веб-сервер shell_exec (testcript) выполнял команду с помощью 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
для исполняемого файла chown). Если исполняемый файл будет запускаться с одинаковыми аргументами каждый раз, вы можете добавить его аргументы сразу после имени исполняемого файла, чтобы еще больше ограничить его использование.
Например, скажем, что мы всегда хотим скопировать тот же файл в каталог /root/, мы напишем следующее:
www-data ALL = (root) NOPASSWD: /bin/cp /root/test1 /root/test2
-
Измените script (testcript):
Измените script таким образом, чтобы перед командой, требующей прав root (sudo /bin/chown ...
или sudo /bin/cp /root/test1 /root/test2
), появляется sudo
). Убедитесь, что аргументы, указанные в файле конфигурации sudo, точно соответствуют аргументам, используемым с исполняемым файлом в этом файле.
Итак, для нашего примера выше, у нас было бы следующее в script:
sudo /bin/cp /root/test1 /root/test2
Если вы все еще получаете отказ в доступе, разрешения script и его разрешения родительских каталогов могут не разрешить веб-серверу выполнять сам script.
Таким образом, вам нужно переместить script в более подходящую директорию и/или изменить разрешения script и родительского каталога, чтобы разрешить выполнение через www-data (пользователь или группу), что выходит за рамки данного руководства.
Имейте в виду:
При настройке sudo целью является разрешить команде в ней наиболее ограниченную форму. Например, вместо того, чтобы разрешать общее использование команды cp, вы разрешаете только команду cp, если аргументы, скажем, /root/test 1/root/test2. Это означает, что аргументы cp (и функциональность cp не могут быть изменены).
Ответ 3
Это простая проблема. Когда вы работаете с терминалом, вы запускаете php файл с терминала в качестве привилегированного пользователя. Когда вы переходите на php из своего веб-браузера, PHP скрипт запускается как пользователь веб-сервера, у которого нет прав на выполнение файлов в вашем домашнем каталоге. В Ubuntu пользователь www-data является пользователем веб-сервера apache. Если вы на ubuntu, вам нужно будет сделать следующее:
chown yourusername: www-data/home/testuser/testscript
chmod g + x/home/testuser/testscript
то, что указано выше, передает вам права пользователя на файл, и дает группе веб-сервера право собственности на нее. следующая команда дает файлу разрешение на выполнение группы. Теперь, в следующий раз, когда вы пойдете вперед и сделаете это из браузера, он должен работать.
Ответ 4
Я боролся с этой точной проблемой в течение трех дней. Я установил разрешения на script до 755. Я назвал свой script следующим образом.
<?php
$outcome = shell_exec('/tmp/clearUp.sh');
echo $outcome;
?>
Мой script был следующим.
#!bin/bash
find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;
Я не получал никакой информации или обратной связи. Изменение, которое я сделал для запуска script, заключалось в том, чтобы добавить cd в tmp внутри script:
#!bin/bash
cd /tmp;
find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;
Это была скорее удача, чем суждение, но теперь она отлично работает. Надеюсь, это поможет.