Вопрос по exec, php, bash – Запустите команду Bash из PHP

45

У меня есть скрипт bash, который я запускаю так из командной строки:

./script.sh var1 var2

Я пытаюсь выполнить вышеупомянутую команду после того, как я вызываю определенный файл php.

Что у меня сейчас есть:

$output = shell_exec("./script.sh var1 var2");
echo "<pre>$output</pre>";

Но это не работает. Я попробовал это с помощьюexec а такжеsystem тоже, но сценарий так и не был выполнен.

Однако, когда я пытаюсь бежатьshell_exec("ls"); это работает и$output это список всех файлов.

Я не уверен, связано ли это с ограничением используемого мной VPS или проблема в другом месте?

По какому пути вы бежите? Что значитpwd вернуть? alex
Работает ли сshell_exec('sh script.sh')? Dan Lee
Этот bash-скрипт находится в той же директории, что и ваш PHP-скрипт? Является ли рабочий каталог скрипта php тем же каталогом? Marc B
Ваш скрипт исполняетсяapache или жеwww-data пользователь? core1024
Есть ли в вашем скрипте соответствующий заголовок интерпретатора, и вы можете запустить его вручную с вашего терминала? Подобно:#!/bin/bash Robert K

Ваш Ответ

3   ответа
67

Вам, вероятно, нужноChDir в правильный каталог перед вызовом скрипта. Таким образом, вы можете убедиться, в каком каталоге находится ваш скрипт & quot; в & quot; перед вызовом команды оболочки.

$old_path = getcwd();
chdir('/my/path/');
$output = shell_exec('./script.sh var1 var2');
chdir($old_path);
Я думаю, что это добилось цели! По крайней мере, я работал с простым тестовым скриптом. Чтобы наконец это проверить, мне нужно подождать, пока хостер сервера сообщит мне точный путь к сценариям. Я все же отмечу ответ сейчас. Спасибо! Oskar
@Andrej: Или используйте абсолютный путь к вашему сценарию вместо относительного.
Спасибо, парни! Это работает сейчас. Там появилсяnew problem, но этот решен;) Oskar
@Andrej. Если вы используете PHP 5.3, вы можете использоватьchdir(__DIR__) изменить каталог на каталог, содержащий скрипт. Или для PHP 5.2 или меньше,dirname(__FILE__) сделает свое дело.
Если вы хотите быть содержательным обменомshell_exec вне дляbacktick operator.
0

Проверьте, не установили ли open_basedir в php.ini или .htaccess домена, который вы используете. Это поместит вас в каталог вашего домена, и php получит доступ только для выполнения внутри этого каталога.

5

Ваш shell_exec выполняется пользователем www-data из его каталога. Ты можешь попробовать

putenv("PATH=/home/user/bin/:" .$_ENV["PATH"]."");

Где находится ваш скрипт/home/user/bin Позже вы можете

$output = "<pre>".shell_exec("scriptname v1 v2")."</pre>";
echo $output;

Для отображения вывода команды. (В качестве альтернативы, без экспорта пути, попробуйте указать полный путь к вашему сценарию, а не просто ./script.sh

Нет необходимости изменятьPATH переменная окружения. Вместо этого следует изменить текущий рабочий каталог (см.my answer).
Правда. Благодарю. Я использовал параметры пути в своем коде, потому что у меня есть различные пользовательские исполняемые файлы в более чем одном месте, и я хотел, чтобы поле ввода работало как консоль, поэтому я могу вызывать любую команду из них. Если он должен использоваться только для выполнения одного файла, мы в любом случае можем просто использовать shell_exec (& all / path / to / file / & ap;);

Похожие вопросы