Php exec sh permission denied

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

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

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

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

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

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

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

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

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

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

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

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

  • Попробуйте выполнить нижеприведенную тестовую команду и проверьте, работает ли она:
    • php -r «echo exec(‘whoami’);»
    • chmod 755 dir; chmod 755 file
    • Попробуйте также добавить +s флаг (sudo) в файл (не рекомендуется):
      • chmod u+s file ,
      • В противном случае переместите скрипт в него,
      • или добавьте этот каталог в вашу конфигурацию Apache,
      • или добавьте этот каталог к ​​себе include_path , например:
        • php.ini файл: include_path «.:/usr/local/lib/php:/your/dir»
        • или .htaccess файл: php_value include_path «.:/usr/local/lib/php:/your/dir»

        Исправление проблем:

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

        Это была моя проблема . родительский каталог не имел прав на выполнение . теперь он работает! Спасибо! 🙂

        Мне все еще не повезло 🙁 Есть предложения? « `[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» « `

        Такая проблема может зависеть от используемой вами ОС и от того, как она настроена. Некоторые дистрибутивы 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, то на самом деле не очевидно, что, черт возьми, происходит. Это спасло мой день!

        Так что я попал сюда после поиска аналогичной проблемы в 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

        Затем вам нужно закомментировать эту строку:

        Если вы этого не сделаете, вы увидите эти ошибки в / var / log / secure: «извините, у вас должен быть tty для запуска sudo». Теперь вы готовы к работе, и код PHP прост:

        $ results = shell_exec (‘дата sudo’);

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

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

        Источник

        PHP script can’t run bash script. sh: Permission denied

        I’m trying to exec a .sh script from PHP, however it is not executing. I checked the error logs, and I’m getting the ‘sh: Permission denied’ error. I checked under which user php is being run, and it’s done under the apache user. I tried changing the .sh’s ownership to the apache user, but there is no result. I thought at first this was because the script was outside the www/ dir, however even when I put the script in the same directory, the error is still being given. Are there any solutions to this other than adding the apache user to the SUDOers list? The sh script runs fine if I launch it from putty using the ‘php filename.php’ command.

        Is it a shell script or a PHP file? Your last paragraph isn’t clear about that. Also, did you set execute permissions ( x ) on the file? Did you specify the script interpreter in a shebang line?

        It’s a bash script to be ran from PHP. Yes I did make it an executable and I did specify the script interpreter. It works correctly when I execute the PHP script from putty and the bash script gets called and runs correctly. But if I run the php script from the webbrowser instead it fails to run the bash script and it will do this error since it’s running as the apache user and not the user I use in putty.

        Try chmod 775 yourscript.sh . That will give r-x (read and execute) permissions to «Other» users on that file.

        I tried it. No luck.. I can’t know the exact reason until tomorrow though. I don’t have access to the logs from my location. I will get back to you guys. Thank you for your help. 🙂

        5 Answers 5

        Try the following suggestions:

Оцените статью