Разрешение php shell_exec () в Linux Ubuntu

13

Я разрабатываю php-приложение с использованием Linux-сервера. Моя проблема заключается в выполнении shell_exec()вызова какого-либо exe-файла не работает (на самом деле не exe, это своего рода исполняемый файл Linux)

echo shell_exec("whoami");

У меня есть демон

echo shell_exec("ls")

У меня есть имя файла, но

echo shell_exec("php -v")

У меня ничего нет, пустая страница

echo shell_exec("php ....bla bla bla")

пустая страница тоже.

Все эти команды, если я наберу на терминале (пользователь ху) будут работать. Я искал в Google в течение нескольких часов, люди говорят, что из-за разрешения. У меня нет опыта работы с Linux. Что я должен сделать, чтобы выполнить мою программу в php?

ngoaho91
источник

Ответы:

10

Пользователю Apache www-dataнеобходимо предоставить привилегии для запуска определенных приложений sudo.

  1. Запустите команду sudo visudo. На самом деле мы хотим отредактировать файл в. etc/sudoersЧтобы сделать это, используя sudo visudoв терминале, он дублирует (временный) sudoersфайл для редактирования.
  2. В конце файла добавьте следующее, например: -если мы хотим использовать команду для restartкопчения и phpкоманду для другого действия в вашем вопросе,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php

(Это предполагает, что вы хотите запускать restartи phpкоманды, используя привилегии суперпользователя (root). И вы используете phpкоманду в usr/bin/пути)

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

www-data ALL=NOPASSWD: ALL

3. После редактирования файла sudoers ( visudoмы редактируем временный файл, sudoersпоэтому сохраняем и выходим из временного файла (visudo) для записи в sudoersфайл. ( wq!)

4. Вот и все, теперь используйте exec()или shell_execследующим образом внутри вашего xxx.phpскрипта. Не забудьте использовать sudoперед использованием команды в сценарии php.

например: -

exec ("sudo /etc/init.d/smokeping restart 2>&1");

или

shell_exec("sudo php -v"); 

Так что в вашей проблеме добавьте команды, которые вы хотите использовать в к, step no (2.)как я добавляю, и измените ваш php-скрипт на то, что вы хотите.

здесь та же проблема, что и у вас /programming//a/22953339/1862107

Туситха Суманадаса
источник
Этот вопрос не об использовании sudo.
Трикасс
Это сформулировано так плохо
Барни Чамберс
5

Попробуйте указать полный путь к бинарному файлу php. Например, /usr/bin/php

Если вы этого не знаете, найдите его, используя: which php

Кейран Холлоуэй
источник
echo shell_exec ("/ usr / bin / php -v"); не работает
ngoaho91
когда вы говорите «не работает», что вы получаете? Т.е. какие-то ошибки? Что-нибудь в ваших журналах ошибок php / apache? Если страница пуста, просмотр источника даст вам что-нибудь для работы? К сожалению, термин «не работает» не дает нам ничего общего с ...
Кейран Холлоуэй
@ ngoaho91 - обычно это логи /var/log/httpd/error*.
SLM
: D У меня есть пустая страница, ничего не видно. где файл журнала ошибок php / apache?
ngoaho91
@ ngoaho91 - что это за дистрибутив Linux? CentOS, Ubuntu?
SLM
4

Как правило , вы хотите , чтобы указать полные пути к приложениям , таким как whoami, lsи php. Если вы не уверены, каково расположение программы (полный путь), вы можете узнать так:

$ type php
php is /usr/bin/php

Затем укажите это так в вашем сценарии.

<?php
    echo shell_exec("/usr/bin/php ....bla bla bla");
?>
SLM
источник
я управляю твоей командой Тип php => php это / usr / bin / php. но команда полного пути все еще возвращает мне пустую страницу.
ngoaho91
Что делать, если вы делаете это echo shell_exec("/usr/bin/php somefile.php 2>&1")?
SLM
echo shell_exec ("/ usr / bin / php index.php 2> & 1") => / usr / bin / php: ошибка перемещения: / usr / bin / php: символ X509_free, версия OPENSSL_1.0.0 не определена в файле libcrypto. so.1.0.0 с указанием времени ссылки
ngoaho91
Хорошо, веб-сервер (Apache) обычно работает как другой пользователь, а не hu. Таким образом , вы должны убедиться , что скрипт phpпытается бежать устанавливаются следующим образом: chmod 755 somescript.php. Это позволит пользователю, на котором работает Apache, иметь возможность выполнять и читать ваш .phpфайл.
SLM
1
@ ngoaho91 - теперь все должно быть хорошо, эта ошибка говорит мне, что что-то не так с вашей настройкой Apache / PHP. freetutorialssubmit.com/php-relocation-error/2221
ОДС
2

Ваш php.ini ограничивает доступный набор команд?

Это из моего /etc/php5/php.ini

; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
; http://php.net/safe-mode-exec-dir
safe_mode_exec_dir =
X Тянь
источник
нет, мои инни такие же как и у тебя
ngoaho91
2

Как отладить проблемы с shell_exec

Хорошо, здесь у нас проблема: что-то работает в терминале и не работает в shell_exec php (или exec, spawn, как угодно). Давайте подумаем: в чем разница между вами и php? Вот три:

PHP выполняется из правил HTTP-сервера

Действительно, Ваш терминал работает от yournameпользователя, а php - от пользователя www-data. Итак, первая идея - открыть терминал от www-dataпользователя и попробовать ту же команду. Так....

  • Откройте /etc/passwdфайл, найдите строку сwww-data пользователем и измените его оболочку входа (последнюю) с /bin/false(или как угодно) на /bin/bash.
  • открыто www-data терминал:su www-data
  • Попробуйте php -v или что-то, что вы не можете выполнить из php. Если это не сработает - вы увидите красивые логи и сможете отладить проблему.
  • Не забудьте исправить задний /etc/passwdфайл, пока все готово

PHP выполняется из PHP .

PHP достаточно параноидален, и в настройках apache / nginx и php.ini есть много опций, которые могут помешать вашей попытке.

Это немного сложнее для отладки. Здесь есть два варианта:

  • Включите логи в браузере и увидите проблему. Отредактируйте свой php.ini, включите display_errorsи все остальные флаги, чтобы увидеть ошибки в браузере. Вы можете прочитать и отладить их.

  • Получить www-dataоболочку (см. Первый раздел) и выполнить что-то вроде

echo '<?php shell_exec("php -v"); ?>' | php

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

PHP выполняется из SELinux / apparmor

Selinux и apparmor - это средства безопасности, которые запрещают приложениям выполнять определенные действия (например, порождать другие приложения или некоторые другие конкретные приложения). Возможно, он включен на вашем сервере.

Чтобы проверить - отключите selinux / apparmor и проверьте, существует ли проблема.

Чтобы исправить - прочитайте соответствующее руководство и исправьте напишите разрешительные правила для Вашего случая.

Arenim
источник
0

Для меня самым простым способом было зайти внутрь php.ini и прокомментировать строку, начинающуюся с

disable_functions
Alex
источник