Linux 서버를 사용하여 PHP 응용 프로그램을 개발 중입니다. 내 문제는 shell_exec()
일부 exe 파일을 호출 하기 위해 실행 중입니다 (실제로 exe는 아닙니다, 일종의 Linux 실행 파일입니다)
echo shell_exec("whoami");
나는 데몬을 얻었다
echo shell_exec("ls")
파일 이름이 있지만
echo shell_exec("php -v")
빈 페이지가 없습니다
echo shell_exec("php ....bla bla bla")
빈 페이지도.
터미널 (사용자 hu)에 입력하면이 모든 명령이 작동합니다. 몇 시간 동안 구글을 검색했는데 사람들은 허가 때문에 그렇게 말합니다. 나는 리눅스에 대한 경험이 없다. PHP에서 프로그램을 실행하려면 어떻게해야합니까?
답변
Apache 사용자 www-data
에게는을 사용하여 특정 응용 프로그램을 실행할 수있는 권한이 필요합니다 sudo
.
- 명령을 실행하십시오
sudo visudo
. 실제로 우리는에서 파일을 편집하고 싶습니다etc/sudoers
.sudo visudo
터미널 을 사용하여 복제 할 (temp)sudoers
파일을 편집하십시오. - 파일 끝에 다음 ex를 추가하십시오
restart
.-흡연에 대한 명령을 사용 하고php
질문에서 다른 작업에 대한 명령을 사용하려는 경우 ,
www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php
(이것은 당신이 실행하고자하는 것을 가정 한 것입니다 restart
및 php
슈퍼 사용자 (루트)를 사용하여 명령을 사용 privileges.And php
의 명령 usr/bin/
경로)
그러나 수퍼 유저 권한을 사용하여 모든 응용 프로그램을 실행하려면 위의 항목 대신 다음을 추가하십시오 ALL
. 명령이 아닌 매우 위험한 작업은 원하지 않을 수 있습니다 .
www-data ALL=NOPASSWD: ALL
3. sudoers 파일을 편집 한 후 ( visudo
임시 파일을 편집하여 sudoers
임시 파일 (visudo)을 저장하고 종료하여 sudoers
파일 에 씁니다 . ( wq!
)
4. 이제 스크립트 내부에서 exec()
또는 shell_exec
다음과 같은 방식으로 사용 하십시오 xxx.php
. PHP 스크립트에서 명령 을 사용 sudo
하기 전에 사용하십시오.
전의:-
exec ("sudo /etc/init.d/smokeping restart 2>&1");
또는
shell_exec("sudo php -v");
따라서 문제에서 step no (2.)
PHP 스크립트를 추가하고 원하는대로 사용하려는 명령을 추가하십시오 .
여기는 /programming//a/22953339/1862107 과 같은 문제입니다.
답변
PHP 바이너리의 전체 경로를 지정하십시오. 예 : /usr/bin/php
모르는 경우 다음을 사용하여 찾으십시오. which php
답변
당신은 일반적으로 다음과 같은 응용 프로그램에 전체 경로를 지정하려면 whoami
, ls
하고 php
. 프로그램의 위치 (전체 경로)가 확실하지 않은 경우 다음과 같이 확인할 수 있습니다.
$ type php
php is /usr/bin/php
그런 다음 스크립트에서 이와 같이 지정하십시오.
<?php
echo shell_exec("/usr/bin/php ....bla bla bla");
?>
답변
php.ini가 사용 가능한 명령 세트를 제한합니까?
이것은 내에서 /etc/php5/php.ini
; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
; http://php.net/safe-mode-exec-dir
safe_mode_exec_dir =
답변
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 구성에는 많은 옵션이있어 시도를 방해 할 수 있습니다.
디버깅하기가 좀 더 복잡합니다. 여기에는 두 가지 옵션이 있습니다.
-
브라우저에서 로그를 활성화하고 문제를 확인하십시오. 편집 귀하의
php.ini
켜지지display_errors
다른 모든 플래그는 브라우저에서 오류를 볼 수 있습니다. 그것들을 읽고 디버깅 할 수 있습니다. -
확보
www-data
의 쉘 (첫 번째 섹션 참조)와 같은 것을 실행
echo '<?php shell_exec("php -v"); ?>' | php
콘솔에서 동일한 PHP 코드를 실행하면 오류를보고 디버그 할 수 있습니다.
PHP는 SELinux / apparmor에서 실행됩니다
Selinux와 Apparmor는 응용 프로그램이 특정 작업 (예 : 다른 응용 프로그램이나 특정 다른 응용 프로그램을 생성)을 수행하지 못하게하는 보안 기능입니다. 서버에서 활성화되었을 수 있습니다.
확인하려면-selinux / apparmor를 비활성화하고 문제가 있는지 확인하십시오.
수정하려면-해당 설명서를 읽고 사례에 대한 쓰기 허용 규칙을 수정하십시오.
답변
나에게 가장 간단한 방법은 php.ini에 들어가서 시작하는 줄을 주석 처리하는 것이 었습니다.
disable_functions