11

Вопрос по bash, ubuntu, shell, php, exec – Как мне изменить оболочку для phec exec ()

Я хочу использовать php 'Функция exec () на сервере Ubuntu. Проблема, я всегда получаю ошибку, что команда не найдена. Например, используя

exec("echo 123");

печать

sh: / echo: не найдено

Мне кажется, что php использует оболочку sh, когда я хочу использовать bash. Я попытался изменить оболочку для www-данных в / etc / passwd, это неТ тоже не поможет.

Кто-нибудь есть идея, откуда еще проблема может возникнуть или как я могу изменить оболочку для PHP?Пользователь Ubuntu.

Спасибо тимо

[РЕДАКТИРОВАТЬ]

Может быть, это поможет:

Я называю bash-скрипт из ssh как timo, этот скрипт вызывает php-скрипт, который использует exec. Я знаю, это звучит странно, но эточасть большей среды разработки ...

Дело в том, что яЯ никогда не уверен, от какого пользователя выполняется скрипт внутри exec.

[РЕДАКТИРОВАТЬ]

К настоящему времени я понял, что должна быть другая проблема прав. Даже если я попытаюсь вызвать bash-скрипт test.sh (s полный путь!) из exec, php test.php просто скажет.

sh: /test.sh: не найдено

4 ответа
0

Я думаю

что PHP вызывает / bin / sh внутри (или cmd.exe в Windows) независимо от того, какую функцию вы используете.

Бегls -l /proc/$$/exe | sed 's%.*/%%' в вашем терминале в системе Linux должен сказать вам, какую оболочку выиспользуется в моем терминале Ubuntu по умолчанию. Если вы запустите следующее в Ubuntu:

<!--?php

exec('ls -l /proc/$$/exe | sed \'s%.*/%%\'', $res);
// or:
//$res = shell_exec('ls -l /proc/$$/exe | sed \'s%.*/%%\'');
echo(json_encode($res));
</code-->

ты получишь ["тире"] как результат, независимо от того, какую функцию вы используете. Если вы измените / bin / sh, чтобы он указывал на bash, а не на dash, результат от PHP изменится на bash, но я неЯ рекомендую делать это, очевидно.

Короче говоря,Вероятно, невозможно изменить это без изменения всего вашего сервера.Оболочка по умолчанию или компиляция PHP из исходного кода.

Если вы хотите раскрыть тайну дальше,Вероятно, это связано с ext / standard / proc_open.c и ext / standard / exec.c (все эти функции есть, system, passthru и т. д.) в исходном коде PHP, но, честно говоря, это лучше, чем я.

10

Попробуйте вместо этого shell_exec (). exec не должен вызывать какую-л

ибо оболочку для выполнения вашей программы. Кроме того, вы можете вызвать Bash с exec, как

exec("/bin/bash -c \"echo $foo > bar.txt'\"")

У меня нет опыта работы в безопасном режиме, так что, возможно, это ваша проблема. Попробуй выключить? Ты не долженв любом случае, это неуходит и было плохой идеей с самого начала (перечислите большинство языков PHP "функции")php.net/manual/en/features.safe-mode.php

от Trey

Didn»Не замечайте, что кто-то уже упоминал об этом - согласованный безопасный режим считается вредным. Что касается safe_mode_exec_dir, если безопасный режим включен и для него задано пустое значение, это объясняет это (если вы хотите выполнить что-либо, для него нужно установить значение /). Я предлагаю вам попытаться установить что-то значимое и вызвать что-то на этом пути.

от Iain Collins

это просто скажетsh: / bash: не найдено ", похоже, что php ищет все двоичные файлы в /. в php.ini safe_mode_exec_dir не установлен, так что я думаю, это означает, что нет никаких ограничений !? (меняя это не 'кажется, чтобы помочь)

от Timo
0

Если то, что вы хотите сделать, это:

/usr/bin/mysql --user=asdf --password=asdf mydb < ./dump.sql

Тогда я думаю, что это будет работать (независимо от оболочки):

/usr/bin/mysql --user=asdf --password=asdf mydb < /full/path/to/dir/dump.sql

проблема не в том, что мой дамп не может быть найден, скорее, MySQL можетне найти ...

от Timo

Ох, и яя не уверен, как на самом деле установить оболочку в PHP, но вы можете вызвать скрипт из sh с помощью "#! / Bin / Баш» как это'Если вы действительно нуждаетесь в bash (и можетене могу найти другой способ сделать это).

от Iain Collins

Если на самом деле в / usr / bin / mysql установлен бинарный файл, то sh найдет его, и проблема в другом - например, возможно, включен безопасный режим (ознакомьтесь с документами для safe-mode-exec-dir и т. П.). Еще одна вещь, которую нужно проверить, это open_basedir, который также может ограничивать доступ к exec.

от Iain Collins
0

Я думаю

что проблема в том, что нет установки $ PATH. Попробуйте использовать полные пути к вашим двоичным файлам, например / bin / echo

Спасибо за супер быстрый ответ. К сожалению, это нене решить проблему. / bin / echo notn 'тоже не работает. Что я на самом деле хотел сделать, это / usr / bin / mysql --user = asdf --password = asdf mydb < ./dump.sql Как видите, я даже использовал абсолютный путь. Эхо было просто примером, чтобы сделать его более простым ... Может быть, есть другие идеи?

от Timo

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