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

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

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

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

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

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

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

5 ответов

Решение

Попробуйте следующие предложения:

  • Попробуйте выполнить нижеприведенную тестовую команду и проверьте, работает ли она:
    • 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, так далее.).

Such an issue might depend on the OS you use and how it is configured. Some linux distros (mainly those based on RHEL like CentOS or Fedora) come with SELinux activated by default. This can be checked, and temporarily changed, with the following commands:

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

You can also have a more complete view on the current configuration with:

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

This change can be made permanent by editing the /etc/selinux/config file and set the 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

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

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

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

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

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

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

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

Запуск корневых команд в 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');

Другие вопросы по тегам