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.