Shell_exec 문제를 디버깅하는 방법
자, 여기에 문제가 있습니다 : 터미널에서 작동하고 PHP의 shell_exec (또는 exec, spawn 등)에서는 작동하지 않습니다. 생각해 봅시다 : 당신과 PHP의 차이점은 무엇입니까? 다음은 세 가지입니다.
PHP는 HTTP 서버 규칙에서 실행됩니다
실제로, 귀하의 터미널은 yourname
사용자 로부터 실행 중이고 php는에서 실행됩니다 www-data
. 따라서 첫 번째 아이디어는 www-data
사용자 로부터 터미널을 열고 동일한 명령을 시도하는 것입니다. 그래서....
/etc/passwd
파일을 열고 www-data
사용자가 있는 줄을 찾아 로그인 쉘 (마지막)을에서 /bin/false
(또는 무엇이든)으로 변경하십시오 /bin/bash
.
www-data
의 터미널을 엽니 다 .su www-data
- php -v 또는 PHP에서 실행할 수없는 모든 것을 시도하십시오. 작동하지 않는 경우-멋진 로그가 표시되고 문제를 디버깅 할 수 있습니다.
/etc/passwd
완료 한 후에 파일 을 수정하는 것을 잊지 마십시오
PHP는 PHP에서 실행됩니다 .
PHP는 편집증 적이며 아파치 / nginx 및 php.ini 구성에는 많은 옵션이있어 시도를 방해 할 수 있습니다.
디버깅하기가 좀 더 복잡합니다. 여기에는 두 가지 옵션이 있습니다.
echo '<?php shell_exec("php -v"); ?>' | php
콘솔에서 동일한 PHP 코드를 실행하면 오류를보고 디버그 할 수 있습니다.
PHP는 SELinux / apparmor에서 실행됩니다
Selinux와 Apparmor는 응용 프로그램이 특정 작업 (예 : 다른 응용 프로그램이나 특정 다른 응용 프로그램을 생성)을 수행하지 못하게하는 보안 기능입니다. 서버에서 활성화되었을 수 있습니다.
확인하려면-selinux / apparmor를 비활성화하고 문제가 있는지 확인하십시오.
수정하려면-해당 설명서를 읽고 사례에 대한 쓰기 허용 규칙을 수정하십시오.