14

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

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

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

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

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

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

5 ответов5

11

Такая проблема может зависеть от используемой вами ОС и от того, как она настроена. Некоторые дистрибутивы 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 строки audit.log в команду audit2allow . Он выведет вам изменения, необходимые для того, чтобы сделать SELinux счастливым. Но обычно предлагаемые изменения необходимо вносить в саму политику SELinux, а это не то, что вы должны делать в вашем случае (тем не менее, этот вывод может дать некоторую подсказку о том, что происходит).

На следующей странице описывается похожая проблема и различные способы ее решения: http://sheltren.com/stop-disabling-selinux

8

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

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

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

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

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

0

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

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

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

Что-то с использованием 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');

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .