дозвіл 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")

пуста сторінка теж.

Всі ці команди, якщо я введу термінал (користуваче hu), спрацюють. Я кілька годин шукав google, люди кажуть, що через дозвіл. У мене немає досвіду роботи в Linux. Що мені потрібно зробити, щоб виконати свою програму в php?

Відповіді:


10

Користувачеві Apache www-dataпотрібно надати привілеї для виконання певних програм за допомогою sudo.

  1. Виконайте команду sudo visudo. Насправді ми хочемо відредагувати файл у. etc/sudoersДля цього, використовуючи sudo visudoв терміналі, він дублює (temp) 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


Це питання не стосується використання судо.
tricasse

Це сказано так погано
Барні Чемберс

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");
?>

я запускаю вашу команду. введіть 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
slm

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 =

ні, моє іні те саме, що і твоє
ngoaho91

2

Як налагодити помилки shell_exec

Гаразд, тут у нас проблема: якась річ працює в терміналі і не працює в php's shell_exec (або 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 і перевірте, чи існує проблема.

Для виправлення - прочитайте відповідне керівництво та виправте правила дозволу на написання для Вашої справи.


0

Для мене найпростішим способом було зайти всередину php.ini та прокоментувати рядок, який починається з

disable_functions
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.