리눅스 우분투에 대한 php shell_exec () 권한 데몬을 얻었다 echo shell_exec(“ls”) 파일 이름이 있지만 echo

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.

  1. 명령을 실행하십시오 sudo visudo. 실제로 우리는에서 파일을 편집하고 싶습니다 etc/sudoers. sudo visudo터미널 을 사용하여 복제 할 (temp) sudoers파일을 편집하십시오.
  2. 파일 끝에 다음 ex를 추가하십시오 restart.-흡연에 대한 명령을 사용 하고 php질문에서 다른 작업에 대한 명령을 사용하려는 경우 ,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php

(이것은 당신이 실행하고자하는 것을 가정 한 것입니다 restartphp슈퍼 사용자 (루트)를 사용하여 명령을 사용 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


답변