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


14

Я пытаюсь выполнить сценарий .sh из PHP, однако он не выполняется.

Я проверил журналы ошибок и получаю ошибку «sh: Permission denied». Я проверил, под каким пользователем запускается php, и это делается под пользователем apache.

Я попытался сменить владельца .sh на пользователя apache, но результата нет.

Сначала я подумал, что это потому, что скрипт находится за пределами www / dir, однако даже когда я помещаю скрипт в ту же директорию, ошибка все равно появляется.

Есть ли какие-то решения, кроме добавления пользователя apache в список SUDOers?

Скрипт sh работает нормально, если я запускаю его из putty с помощью команды php filename.php.


3
Это сценарий оболочки или файл PHP? Ваш последний абзац не ясно об этом. Кроме того, вы установили права на выполнение ( x) для файла? Вы указали интерпретатор сценария в строке Шебанга?
Даниэль Бек

Это скрипт bash, запускаемый из PHP. Да, я сделал его исполняемым, и я определил интерпретатор сценария. Он работает правильно, когда я выполняю скрипт PHP из putty, и скрипт bash вызывается и работает правильно. Но если я вместо этого запускаю php-скрипт из веб-браузера, он не запускает bash-скрипт и будет делать эту ошибку, поскольку он работает как пользователь apache, а не как пользователь, которого я использую в putty.
Робин Престо

1
Попробуй chmod 775 yourscript.sh. Это даст r-x(чтение и выполнение) разрешения «другим» пользователям в этом файле.
Rhyuk

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

Ответы:


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 / sleep safe_mode = Off include_path = "/ tmp: / home / kiwi_build" `` `
pihentagy

1
Argh, Setenforce решил это. 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


Спасибо за подробный ответ! Увы, как я уже говорил, у меня не может быть root-доступа до завтра. Так что я тоже к тебе вернусь! :) И да, я использую CentOS.
Робин Престо

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

Не беспокойтесь, рад узнать, что вы узнали из моего поста!
Тонин

Если проблема заключается в использовании Getenforced, то на самом деле не очевидно, что, черт возьми, происходит. Это спасло мой день!
pihentagy

1

Так что я попал сюда после поиска аналогичной проблемы в Google. Я подумал, что комментарий о SELinux направил меня в правильном направлении.

В моем собственном случае я использовал собственный сценарий развертывания Git, который использует команду оболочки. Команда отлично работает на BASH, но в Git есть «отказано в разрешении» и «нет хранилища». Это было действительно странно, и я прошел через несколько исправлений, пока не наткнулся на этот ответ.

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


0

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

Мой сервер работает под управлением Debian стабильно, и попытка выполнить сценарий оболочки сработала один раз, затем разрешения автоматически изменились на 644, и была получена следующая попытка запустить сценарий Permission denied. Это оказалось проблемой для сервера самбы, и я до сих пор не заметил такой схемы.

Разрешение QA Strange изменилось, когда было исправлено сохранение файла на разделе Samba из редактора Windows . Я не знал об map archive = noопционе даже после использования акций самбы в течение десятилетия.

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


-7

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

У меня есть веб-приложение, которое должно выполнять команды оболочки в качестве пользователя root в функции PHP, и вы могли бы подумать, что это будет довольно просто ... но мне понадобилось несколько гуглов, чтобы получить все детали, поэтому вот мои полезные заметки по Это. Это в системе 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 ('дата sudo');


5
Это ужасная идея. Если ваша установка apache скомпрометирована или приложение, которое вы запускаете, делает ... ваш хакер слишком легко получает полный доступ к системе. Правильнее всего менять разрешения в сценарии, а не оставлять их открытыми
Journeyman Geek

2
Я чувствую себя обязанным выдвинуть понижение в этом ответе из-за очевидных проблем безопасности с предоставлением пользователю / роли apache всех разрешений.
Ramhound

@JourneymanGeek Это не «если», это когда установка ставится под угрозу.
Майкл Хэмптон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.