Подтвердить что ты не робот

Выполнение 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.
Как заставить его работать в браузере? Пожалуйста, помогите.

4b9b3361

Ответ 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 {} \;

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