PHP에서 Python 스크립트 실행


114

다음 명령을 사용하여 PHP에서 Python 스크립트를 실행하려고합니다.

exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');

그러나 PHP는 단순히 출력을 생성하지 않습니다. 오류보고는 E_ALL로 설정되고 display_errors는 켜져 있습니다.

내가 시도한 것은 다음과 같습니다.

  • 내가 사용 python2, /usr/bin/python2그리고 python2.7대신/usr/bin/python2.7
  • 나는 또한 아무것도 변경하지 않은 절대 경로 대신 상대 경로를 사용했습니다.
  • 내가 명령을 사용하여 시도 exec, shell_exec, system.

그러나 내가 달리면

if (exec('echo TEST') == 'TEST')
{
    echo 'exec works!';
}

shutdown now아무것도하지 않는 동안 완벽하게 잘 작동합니다 .

PHP에는 파일에 액세스하고 실행할 수있는 권한이 있습니다.

편집 : Alejandro 덕분에 문제를 해결할 수있었습니다. 동일한 문제가 발생하면 웹 서버가 아마도 루트로 실행되지 않을 것임을 잊지 마십시오. 웹 서버의 사용자 또는 유사한 권한을 가진 사용자로 로그인하고 직접 명령을 실행 해보십시오.


먼저이 문제를 방문하십시오. stackoverflow.com/questions/21659637/… 수정되지 않고 In Case와 같은 문제가 발생하면 가져 오기 또는 tty가 멈췄거나 작동하지 않는 askpass가없는 경우이 링크를 확인하여 실행을위한 세부 단계를 확인하십시오. stackoverflow.com/a/57978771/9470457 감사합니다 !!!
3rdi

답변:


159

Ubuntu Server 10.04에서 테스트되었습니다. Arch Linux에서도 도움이되기를 바랍니다.

PHP 에서는 shell_exec 함수를 사용합니다 .

쉘을 통해 명령을 실행하고 전체 출력을 문자열로 반환합니다.

실행 된 명령의 출력을 반환하거나 오류가 발생했거나 명령이 출력을 생성하지 않으면 NULL을 반환합니다.

<?php 

$command = escapeshellcmd('/usr/custom/test.py');
$output = shell_exec($command);
echo $output;

?>

Python 파일 test.py에서 첫 번째 줄에있는이 텍스트를 확인합니다. (shebang 설명 참조) :

#!/usr/bin/env python

또한 Python 파일 에는 올바른 권한 (PHP 스크립트가 브라우저 또는 컬에서 실행되는 경우 사용자 www-data / apache에 대한 실행)이 있어야하고 /하거나 "실행 가능"해야합니다. 또한 .py파일에 대한 모든 명령 에는 올바른 권한이 있어야합니다.

촬영 PHP 매뉴얼에서 :

유닉스 유형 플랫폼에서 shell_exec를 사용하려고하는데 작동하지 않는 것 같은 사람들을위한 간단한 알림입니다. PHP는 시스템에서 웹 사용자로 실행되므로 (일반적으로 Apache의 경우 www) 웹 사용자가 shell_exec 명령에서 사용하려는 파일이나 디렉토리에 대한 권한을 가지고 있는지 확인해야합니다. 그렇지 않으면 아무것도하지 않는 것처럼 보입니다.

유닉스 유형 플랫폼에서 실행 파일만들 려면 다음을 수행하십시오.

chmod +x myscript.py

6
감사합니다, 그게 트릭을했습니다! 한 가지 더 문제가 있습니다. Apache 사용자는 Python 스크립트에서 명령을 실행할 수 없었지만 sudo를 사용하고 내 스크립트에 대한 예외를 sudoers 파일에 추가하여 문제를 해결할 수있었습니다. 다시 한 번 감사드립니다! :)
버려진 계정

1
아파치 사용자와 같은 문제에 직면하고 있습니다.
엠마

1
나는 당신의 대답을 사용했고, 파이썬 스크립트를 잘 실행했지만 웹 페이지에 아무것도 나타나지 않는 결과를 에코 할 수 없습니다. 도와 주시겠습니까?
Hamdi Charef

1
첫 번째 줄의 "#! / usr / bin / env python"이 나에게 트릭을했다. 큰!
C3PO

1
의 경우 : OSX echo shell_exec("/usr/local/bin/python3 /Users/cyborg/Dev/magic.py"); : 나echo shell_exec("/usr/bin/python /Users/cyborg/Dev/magic.py");
싸이 보그

24

passthru출력 버퍼를 직접 사용 하고 처리하는 것이 좋습니다 .

ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean(); 

16

명령의 반환 상태를 알고 전체 stdout출력을 얻으려면 실제로 사용할 있습니다 exec.

$command = 'ls';
exec($command, $out, $status);

$out모든 행의 배열입니다. $status반환 상태입니다. 디버깅에 매우 유용합니다.

당신은 또한보고 싶다면 stderr출력을 당신도 함께 플레이 할 수 proc_open 하거나 추가 할 2>&1당신에게 $command. 후자는 종종 작업을 수행하고 "구현"하는 데 더 빨리 충분합니다.


8

Alejandro는 예외 (Ubuntu 또는 Debian)에 대한 설명을 추가하여 문제를 해결했습니다. 답변 자체에 추가 할 담당자가 없습니다.

sudoers 파일 : sudo visudo

예외 추가 : www-data ALL=(ALL) NOPASSWD: ALL


7
sudoers에 www-data를 추가하는 것은 효과적이지 않으며 Apache에 필요한 더 많은 권한을 제공합니다. 실행중인 스크립트에 www-data 권한을 부여하는 것으로 충분합니다.
JasonRDalton

멋진 아이디어이지만 확실히 시스템을 취약하게 만들 수 있습니다. @JasonRDalton에 동의합니다
Reed


4

제 경우에는 www라는 디렉토리에 새 폴더를 만들어야했습니다 scripts. 내에서 scripts라는 새 파일을 추가했습니다 test.py.

그런 다음 sudo chown www-data:root scriptssudo chown www-data:root test.py.

그런 다음 새 scripts디렉토리로 이동하여 sudo chmod +x test.py.

내 test.py 파일은 다음과 같습니다. 다른 Python 버전에 유의하십시오.

#!/usr/bin/env python3.5
print("Hello World!")

PHP에서 이제 이렇게합니다.

$message = exec("/var/www/scripts/test.py 2>&1");
print_r($message);

그리고 당신은 보여야합니다 : Hello World!


3

위의 방법은 복잡해 보입니다. 내 방법을 참조로 사용하십시오.

다음 두 파일이 있습니다.

  • run.php

  • mkdir.py

여기에서 GO버튼 이 포함 된 HTML 페이지를 만들었습니다 . 이 버튼을 누를 때마다 경로를 언급 한 디렉토리에 새 폴더가 생성됩니다.

run.php

<html>
 <body>
  <head>
   <title>
     run
   </title>
  </head>

   <form method="post">

    <input type="submit" value="GO" name="GO">
   </form>
 </body>
</html>

<?php
	if(isset($_POST['GO']))
	{
		shell_exec("python /var/www/html/lab/mkdir.py");
		echo"success";
	}
?>

mkdir.py

#!/usr/bin/env python    
import os    
os.makedirs("thisfolder");

1

이것은 매우 사소한 일이지만 이미 Alejandro의 제안을 따랐지만이 오류가 발생한 사람을 돕고 싶었습니다.

sh : blabla.py : 명령을 찾을 수 없습니다.

누군가 그 오류가 발생하면 Alejandro가 php 파일을 약간 변경해야합니다.

$command = escapeshellcmd('python blabla.py');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.