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');