PHP-скрипт не може запустити скрипт bash. sh: У дозволі відмовлено


14

Я намагаюся виконати .sh скрипт з PHP, однак це не виконується.

Я перевірив журнали помилок, і я отримую помилку "sh: Дозволу відмовлено". Я перевірив, під яким користувачем використовується php, і це робиться під користувачем apache.

Я спробував змінити право власності .sh на користувача apache, але результату немає.

Спочатку я думав, що це тому, що сценарій знаходився поза www / dir, однак навіть коли я ставлю сценарій у той самий каталог, помилка все ще наводиться.

Чи є якісь рішення для цього, крім додавання користувача apache до списку SUDOers?

Скрипт sh працює нормально, якщо я запускаю його з шпаклівки за допомогою команди 'php filename.php'.


3
Це скрипт оболонки або файл PHP? Ваш останній абзац не зрозумілий з цього приводу. Також ви встановили дозволи xна виконання файлу ( ) у файлі? Ви вказали інтерпретатора сценарію в рядку shebang?
Даніель Бек

Це bash-сценарій, який слід запускати з PHP. Так, я зробив це виконуваним і я вказав інтерпретатора сценарію. Він працює правильно, коли я виконую скрипт PHP з putty і bash-скрипт викликається і працює правильно. Але якщо я запускаю скрипт php від веб-браузера, він не запускає скрипт bash, і він буде робити цю помилку, оскільки працює як користувач apache, а не той користувач, який я використовую в putty.
Робін Престо

1
Спробуйте chmod 775 yourscript.sh. Це дасть r-x(читати та виконувати) дозволи для інших користувачів у цьому файлі.
Рюк

Я спробував це. Не пощастило .. Я не можу знати точну причину до завтра, хоча. У мене немає доступу до журналів із мого місцезнаходження. Я повернусь до вас, хлопці. Дякую за твою допомогу. :)
Робін Престо

Відповіді:


10

Спробуйте наступні пропозиції:

  • Спробуйте запустити нижче тестової команди та перевірте, чи спрацювало воно:
    • php -r "echo exec('whoami');"
  • Переконайтесь, що всі батьківські каталоги та файли мають принаймні r-xдозволи на прапорці:
    • chmod 755 dir; chmod 755 file
  • Переконайтеся, що власником файлу є ваш користувач Apache .
    • Спробуйте також додати +sпрапор (sudo) до файлу (не рекомендується):
      • chmod u+s file,
  • Переконайтеся, що ваш PHP не працює в safe_mode.
  • Переконайтеся, що сценарій знаходиться у вашому корені Apache:
    • В іншому випадку перемістіть сценарій всередині нього,
    • або додати цей каталог до своєї конфігурації Apache,
    • або додати цей каталог у свій include_path, наприклад:
      • php.ini файл: include_path ".:/usr/local/lib/php:/your/dir"
      • або .htaccessфайл:php_value include_path ".:/usr/local/lib/php:/your/dir"
  • Перевірте, чи встановлено оболонку /bin/shдля вашої користувача Apache (наприклад) (наприклад, позначте:) finger.
  • Переконайтеся, що ваш текст php.iniне використовується: disable_functionsдля execфункції
  • Якщо ви використовуєте SELinux або selinux-utilsвстановили (посилена система безпеки Linux), перевірте getenforce/ setenforceконфігурацію, як описано у відповіді @Tonin .

Вирішення проблем:

  • Якщо ви змінили свій файл php.iniабо httpd.confфайл, не забудьте перезапустити веб-сервер,
  • Перевірте журнал помилок Apache для отримання додаткових відомостей.
  • Включити в вашому php.iniвсіх видів помилок ( display_error, error_reportingі т.д.).

1
Це була моя проблема .. батьківський каталог не мав прав на виконання ... він працює зараз! Дякую! :)
Робін Престо

Ще мені не пощастило :( Будь-які пропозиції? `` `[Root @ kiwi tmp] # ls -ld /; ls -ld / tmp; ls -ld / tmp / sleep; grep '^ include_path = \ | ^ safe_mode =' /etc/php.ini dr-xr-xr-x. 27 корінь кореня 4096 вересня 3 12:31 / drwxrwxrwt. 4 корінь кореня 4096 вересня 3 15:45 / tmp -rwxr-xr-x. 1 корінь кореня 24 вересня 3 15:39 / tmp / сон safe_mode = Вимкнено include_path = "/ tmp: / home / kiwi_build" `` `
pihentagy

1
Арг, сила посилилась. OMG
pihentagy

13

Така проблема може залежати від ОС, яку ви використовуєте, та способу її налаштування. Деякі дистрибутиви Linux (в основному такі, що базуються на RHEL, як CentOS чи Fedora), за замовчуванням активуються SELinux. Це можна перевірити та тимчасово змінити за допомогою наступних команд:

root@ls:~# /usr/sbin/getenforce 
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce 
Permissive

Ви також можете мати більш повне уявлення про поточну конфігурацію за допомогою:

root@ls:~# /usr/sbin/sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

Цю зміну можна зробити постійною, відредагувавши /etc/selinux/configфайл та встановивши SELINUXзмінну на permissiveабо disabled.

Але правильний спосіб вирішити подібне питання , якщо ви дійсно в цій ситуації, - це перевірити /var/log/audit/audit.logфайл журналу. Він буде містити всі події, пов'язані з правилами SELinux. Тоді, ймовірно, ви повинні надати сценарію правильний контекст, тобто мати дозвіл на управління користувачем apache / php. Перевірка контексту безпеки SELinux виконується за допомогою ls -Z:

root@ls:~# ls -alZ /var/www/cgi-bin/
drwxr-xr-x  root root system_u:object_r:httpd_sys_script_exec_t .
drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t ..

У цьому списку відображаються користувач, роль та тип кожного файлу / каталогу. Тут httpd_sys_script_exec_tтип надає файлам у директорії cgi дозвіл на виконання httpd. Ваш сценарій оболонки, ймовірно, повинен мати один і той же тип.

Ви також можете подавати audit.logрядки до audit2allowкоманди. Це видасть вам зміни, необхідні для задоволення SELinux. Але зазвичай пропоновані зміни потрібно вносити в самій політиці SELinux, що не є тим, що слід робити у вашому випадку (все-таки цей вихід може дати деяку підказку щодо того, що відбувається).

Наступна сторінка описує подібну проблему та різні способи її вирішення: http://sheltren.com/stop-disabling-selinux


Дякую за детальну відповідь! На жаль, як я вже згадував, я не можу мати доступ до кореня до завтра. Тож я і до вас повернусь! :) І так, я використовую CentOS.
Робін Престо

Я любив вашу відповідь, дуже інформативний! На жаль, я не вибрав ваш, тому що примусовий контроль був відключений, і це не було проблемою. Хоча я багато чого навчився з вашої відповіді, тож дякую. Я проголосую за вас, коли отримаю достатньо репутації :)
Робін Престо

Не хвилюйтесь, радий дізнатися, що ви дізналися з мого посту!
Тонін

Якщо проблема з getenforced, то насправді не очевидно, що за чорт йде. Це врятувало мені день!
pihentagy

1

Тому я потрапив сюди після пошуку подібної проблеми в Google. Я подумав упустити, що коментар про SELinux вказав на мене в правильному напрямку.

У власному випадку я використовував користувацький скрипт розгортання Git, який використовує команду shell. Команда прекрасно працює на BASH, але потім має "відмову в дозволі" та "не сховище" на Git. Це було справді дивно, і я пройшов кілька виправлень, поки не натрапив на цю відповідь.

root@ls:~# /usr/sbin/setenforce Permissive вирішив проблему для мене.


0

Моя ситуація дещо інша, але Google привів мене сюди, тому я подумав, що поділюсь ...

Мій сервер працює стабільно debian і намагається виконати сценарій оболонки, який працював один раз, тоді дозволи дозволи автоматично змінитись на 644, і наступна спроба запустити скрипт отримала Permission denied. Це виявилося для мене проблемою із сервером samba, і я досі не помічав цього шаблону.

Виправлення дозволу QA Strange змінюється під час збереження файлу на розділі Samba з редактора Windows . Я не знав про map archive = noваріант навіть після використання акцій самби протягом десятиліття.

Щось про використання Notepad ++ на робочому столі Windows змінить дозволи цільових файлів на 675 замість 775 під час встановлення umask.


-7

Запуск кореневих команд у PHP через Apache

У мене є веб-додаток, який повинен виконувати команди оболонок як корінь у межах функції PHP, і ви можете подумати, що це було б досить прямо вперед ... але для отримання детальної інформації знадобилося кілька моїх googles, ось ось мої зручні нотатки про це. Це в системі Linux під управлінням Apache, і ми будемо використовувати "sudo" в "shell_exec" для запуску команд.

Головне - відредагувати файл / etc / sudoers, і зазвичай ви можете (як root) використовувати команду “visudo” для цього.

Переконайтеся, що apache може виконувати команди, а не вимагати пароль:

apache  ALL=(ALL)       NOPASSWD: ALL

Тоді вам потрібно прокоментувати цей рядок:

#Defaults    requiretty

Якщо ви цього не зробите, то ви побачите ці помилки в / var / log / secure: "Вибачте, ви повинні мати Tty для запуску sudo". Тепер ви готові до роботи, і код PHP простий:

$ results = shell_exec ('дата судо');


5
Це жахлива ідея. Якщо ваша установка apache порушена, або програма, яку ви запускаєте, робить ваш хакер занадто легко отримує повний доступ до системи. Правильна річ - змінити дозволи на сценарій, а не залишати речі широко відкритими
Journeyman Geek

2
Я відчуваю, що зобов’язаний надати відповідь на цю відповідь через очевидні проблеми безпеки, що надають користувачеві / ролі apache всі дозволи.
Рамхаунд

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