Выполнение скрипта Bash из скрипта PHP

Я хочу выполнить скрипт 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:

  1. Настроить 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 
  2. Измените скрипт (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 {} \; 

Это было скорее удачей, чем суждением, но теперь он отлично работает. Надеюсь, это поможет.