Выполнение скрипта 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 с веб-сервера, вы можете попробовать эту двоичную оболочку ниже. Проверить это решение для того же, что вы хотите сделать.

выполнение корневых команд через PHP


не зная сложности настройки, мне нравится маршрут sudo. Во-первых, вы должны настроить sudo, чтобы разрешить вашему веб-серверу sudo запускать данную команду как root. Затем вам нужно иметь скрипт, который веб-сервер shell_exec (testscript) запускает команду с 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 на Чаун исполняемый). Если исполняемый файл будет выполняться с одними и теми же аргументами каждый раз, вы можете добавить его аргументы сразу после имя исполняемого файла для дальнейшего ограничения его использования.

      например, скажем, мы всегда хотим скопировать один и тот же файл в каталог /root/, мы напишем следующее:

      www-data ALL = (root) NOPASSWD: /bin/cp /root/test1 /root/test2
      
  2. изменить скрипт (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 {} \;

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