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