리눅스 우분투에 대한 php shell_exec () 권한


13

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에서 프로그램을 실행하려면 어떻게해야합니까?

답변:


10

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 과 같은 문제입니다.


이 질문은 sudo 사용에 관한 것이 아닙니다.
tricasse

이것은 너무 심하게 모호하게한다
바니 챔버스에게

5

PHP 바이너리의 전체 경로를 지정하십시오. 예 : /usr/bin/php

모르는 경우 다음을 사용하여 찾으십시오. which php


echo shell_exec ( "/ usr / bin / php -v"); 작동하지 않습니다.
ngoaho91

'작동하지 않습니다'라고 말할 때 무엇을 얻습니까? 즉, 오류가 있습니까? PHP / apache 오류 로그에있는 것이 있습니까? 페이지가 비어 있으면 소스보기로 작업 할 내용이 있습니까? 불행하게도 용어 '작동하지 않는'는 우리에게 제공하지 않습니다 아무것도 ...에 대한 작업
Keiran 홀로 웨이

@ ngoaho91-일반적으로 로그가 /var/log/httpd/error*있습니다.
slm

: D 빈 페이지가 있는데 아무것도 볼 수 없습니다. PHP / apache 오류 로그 파일은 어디에 있습니까?
ngoaho91

@ ngoaho91-이것이 어떤 Linux 배포판입니까? CentOS, 우분투?
slm

4

당신은 일반적으로 다음과 같은 응용 프로그램에 전체 경로를 지정하려면 whoami, ls하고 php. 프로그램의 위치 (전체 경로)가 확실하지 않은 경우 다음과 같이 확인할 수 있습니다.

$ type php
php is /usr/bin/php

그런 다음 스크립트에서 이와 같이 지정하십시오.

<?php
    echo shell_exec("/usr/bin/php ....bla bla bla");
?>

나는 당신의 명령을 실행합니다. php => php는 / usr / bin / php입니다. 그러나 전체 경로 명령은 여전히 ​​빈 페이지를 반환합니다.
ngoaho91

이 작업을 수행하면 어떻게 echo shell_exec("/usr/bin/php somefile.php 2>&1")됩니까?
slm

echo shell_exec ( "/ usr / bin / php index.php 2> & 1") => / usr / bin / php : 재배치 오류 : / usr / bin / php : 기호 X509_free, 버전 OPENSSL_1.0.0이 libcrypto 파일에 정의되어 있지 않습니다. 링크 시간 기준으로 so.1.0.0
ngoaho91

웹 서버 (Apache)는 일반적으로가 아닌 다른 사용자로 실행되고 hu있습니다. 따라서 스크립트 php가 실행을 시도 하고 있는지 확인해야합니다 chmod 755 somescript.php. 이를 통해 Apache를 실행중인 사용자가 .php파일 을 실행하고 읽을 수 있습니다.
slm

1
@ ngoaho91-이제 모든 것이 정상이어야합니다.이 오류는 Apache / PHP 설정에 문제가 있음을 나타냅니다. freetutorialssubmit.com/php-relocation-error/2221
slm

2

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 =

아니, 내 ini는 너의 것과 동일
ngoaho91

2

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를 비활성화하고 문제가 있는지 확인하십시오.

수정하려면-해당 설명서를 읽고 사례에 대한 쓰기 허용 규칙을 수정하십시오.


0

나에게 가장 간단한 방법은 php.ini에 들어가서 시작하는 줄을 주석 처리하는 것이 었습니다.

disable_functions
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.