PHP'den bir Python betiği çalıştırma


114

Aşağıdaki komutu kullanarak PHP'den bir Python betiği çalıştırmaya çalışıyorum:

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

Ancak, PHP herhangi bir çıktı üretmez. Hata raporlama E_ALL olarak ayarlandı ve display_errors açık.

İşte denediğim şey:

  • Ben kullanılan python2, /usr/bin/python2ve python2.7yerine/usr/bin/python2.7
  • Ayrıca hiçbir şeyi değiştirmeyen mutlak bir yol yerine göreli bir yol kullandım.
  • Ben komutları kullanarak denedi exec, shell_exec, system.

Ancak, koşarsam

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

shutdown nowhiçbir şey yapmazken mükemmel çalışıyor .

PHP, dosyaya erişim ve yürütme izinlerine sahiptir.

DÜZENLEME: Alejandro sayesinde sorunu çözebildim. Aynı problemi yaşıyorsanız, web sunucunuzun muhtemelen / umarız root olarak çalışmadığını unutmayın. Web sunucunuzun kullanıcısı veya benzer izinlere sahip bir kullanıcı olarak oturum açmayı deneyin ve komutları kendiniz çalıştırmayı deneyin.


İlk olarak bu sorunu ziyaret edin stackoverflow.com/questions/21659637/… Eğer düzeltilmezse ve In Case gibi sorunlar yaşarsanız, ithalatta takılı kalırsanız veya hiçbir askpass çalışmazsa, lütfen yürütme adımları için bu bağlantıyı kontrol edin. stackoverflow.com/a/57978771/9470457 Teşekkürler !!!
3rdi

Yanıtlar:


159

Ubuntu Server 10.04'te test edilmiştir. Umarım size Arch Linux'ta da yardımcı olur.

PHP'de shell_exec işlevini kullanın :

Komutu kabuk aracılığıyla çalıştırın ve tüm çıktıyı bir dizge olarak döndürün.

Bir hata oluşursa veya komut herhangi bir çıktı üretmezse, yürütülen komuttan çıktıyı veya NULL döndürür.

<?php 

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

?>

Python dosyasında test.py, bu metni ilk satırda doğrulayın: (shebang açıklamasına bakın) :

#!/usr/bin/env python

Ayrıca Python dosyası doğru yetkilere sahip olmalıdır (PHP betiği tarayıcıda veya curl'de çalışıyorsa kullanıcı www-data / apache için yürütme) ve / veya "çalıştırılabilir" olmalıdır. Ayrıca .pydosyadaki tüm komutlar doğru ayrıcalıklara sahip olmalıdır:

Alınan php manuel :

Shell_exec'i unix tipi bir platformda kullanmaya çalışanlar için kısa bir hatırlatma ve işe yaramıyor gibi görünüyor. PHP, sistemdeki web kullanıcısı olarak çalışır (genellikle Apache için www), bu nedenle web kullanıcısının shell_exec komutunda kullanmaya çalıştığınız dosya veya dizinler üzerinde haklara sahip olduğundan emin olmanız gerekir. Aksi takdirde, hiçbir şey yapıyormuş gibi görünmeyecek.

Unix tipi platformlarda yürütülebilir bir dosya yapmak için :

chmod +x myscript.py

6
Teşekkürler, hile yaptı! Bir sorun daha vardı - Apache kullanıcısı Python komut dosyasında bir komut yürütemedi, ancak bunu sudo kullanarak ve sudoers dosyasına komut dosyam için bir istisna ekleyerek düzeltebildim. Tekrar teşekkürler! :)
terk edilmiş hesap

1
Apache kullanıcısının da aynı sorunuyla karşı karşıyayım, lütfen bana yol gösterir misiniz?
Emma

1
Cevabınızı kullandım, python betiğini iyi çalıştırıyor ancak sonuçları web sayfasında hiçbir şeyin görünmediğini yineleyemiyorum, bana yardım edebilir misiniz?
Hamdi Charef

1
İlk satırdaki "#! / usr / bin / env python" bana hile yaptı. Harika!
C3PO

1
İçin : OSX echo shell_exec("/usr/local/bin/python3 /Users/cyborg/Dev/magic.py"); : yaecho shell_exec("/usr/bin/python /Users/cyborg/Dev/magic.py");
Cyborg

24

passthruÇıkış tamponunu doğrudan kullanmanızı ve işlemenizi öneririm :

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

16

Komutun dönüş durumunu bilmek ve stdoutçıktının tamamını almak istiyorsanız , aslında kullanabilirsiniz exec:

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

$outtüm satırların bir dizisidir. $statusiade durumudur. Hata ayıklama için çok kullanışlıdır.

Ayrıca görmek istiyorsanız stderrçıktı ya oynayabilirsiniz proc_open ya da sadece eklemek 2>&1adresinden Müşteri $command. İkincisi, işleri çalıştırmak ve daha hızlı "uygulamak" için genellikle yeterlidir.


8

Alejandro, istisnaya açıklama ekleyerek (Ubuntu veya Debian), cevabın kendisine ekleyecek temsilcim yok:

sudoers dosyası: sudo visudo

istisna eklendi: www-data ALL=(ALL) NOPASSWD: ALL


7
Sudoer'lara www-data eklemede etkili görünmüyor ve apache'ye ihtiyacı olan daha fazla izin veriyor. Yürüttüğünüz komut dosyasında www veri izinleri vermek yeterli olacaktır.
JasonRDalton

Harika bir fikir, ancak kesinlikle sisteminizi savunmasız hale getirebilir. @JasonRDalton
Reed'e

6

Duruma göre hangi komutun kullanılacağını netleştirmek için

exec() - Harici bir programı yürütün

system() - Harici bir programı yürütün ve çıktıyı görüntüleyin

passthru() - Harici bir programı yürütün ve ham çıktıyı görüntüleyin

Kaynak: http://php.net/manual/en/function.exec.php


4

Benim durumumda wwwadlı dizinde yeni bir klasör oluşturmam gerekiyordu scripts. İçine scriptsadlı yeni bir dosya ekledim test.py.

Daha sonra sudo chown www-data:root scriptsve kullandım sudo chown www-data:root test.py.

Sonra yeni scriptsdizine gittim ve kullandım sudo chmod +x test.py.

Test.py dosyam şöyle görünüyor. Farklı Python sürümüne dikkat edin:

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

Php'den şimdi bunu yapıyorum:

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

Ve şunu görmelisiniz: Merhaba Dünya!


3

Yukarıdaki yöntemler karmaşık görünmektedir. Metodumu referans olarak kullan.

Bu iki dosyam var:

  • run.php

  • mkdir.py

Burada GObuton içeren bir HTML sayfası oluşturdum . Bu düğmeye her bastığınızda, yolundan bahsetmiş olduğunuz dizinde yeni bir klasör oluşturulur.

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

Bu çok önemsiz, ancak Alejandro'nun önerisini takip eden ancak şu hatayla karşılaşan herkese yardım etmek istedim:

sh: blabla.py: komut bulunamadı

Herhangi biri bu hatayla karşılaştıysa, o zaman Alejandro tarafından php dosyasında küçük bir değişiklik yapılması gerekir:

$command = escapeshellcmd('python blabla.py');

0

Alejandro Quiroz'dan ilham aldı:

<?php 

$command = escapeshellcmd('python test.py');
$output = shell_exec($command);
echo $output;

?>

Python eklemeniz gerekiyor ve yola gerek yok.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.