PHP से पायथन स्क्रिप्ट चला रहा है


114

मैं निम्नलिखित कमांड का उपयोग करके PHP से पायथन स्क्रिप्ट चलाने की कोशिश कर रहा हूं:

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 में फ़ाइल को एक्सेस करने और निष्पादित करने की अनुमति है।

संपादित करें: एलेजैंड्रो के लिए धन्यवाद, मैं समस्या को ठीक करने में सक्षम था। यदि आपके पास भी यही समस्या है, तो यह मत भूलिए कि आपका वेबसर्वर संभवतः / उम्मीद के साथ रूट के रूप में नहीं चलता है। अपने वेबसर्वर के उपयोगकर्ता या समान अनुमतियों वाले उपयोगकर्ता के रूप में लॉग इन करने का प्रयास करें और कमांड को स्वयं चलाने का प्रयास करें।


सबसे पहले इस मुद्दे पर जाएं stackoverflow.com/questions/21659637/… अगर तय नहीं किया गया है और आपको इंसर्ट जैसे मामले मिलते हैं, अगर आप आयात या ट्टी से अटके हुए हैं या कोई भी काम नहीं कर रहा है तो कृपया इसे निष्पादित करने के लिए विवरण चरणों के लिए इस लिंक की जांच करें। stackoverflow.com/a/57978771/9470457 धन्यवाद !!!
3

जवाबों:


159

उबंटू सर्वर 10.04 पर परीक्षण किया गया। मुझे आशा है कि यह आर्क लिनक्स पर भी आपकी मदद करेगा।

PHP में shell_exec फ़ंक्शन का उपयोग करें :

शेल के माध्यम से कमांड निष्पादित करें और एक स्ट्रिंग के रूप में पूरा आउटपुट लौटाएं।

यह निष्पादित कमांड या NULL से आउटपुट देता है यदि कोई त्रुटि हुई या कमांड कोई आउटपुट नहीं देता है।

<?php 

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

?>

पायथन फ़ाइल में test.py, इस पाठ को पहली पंक्ति में सत्यापित करें: (शेबंग समझाएँ देखें) :

#!/usr/bin/env python

इसके अलावा पायथन फाइल में सही विशेषाधिकार (उपयोगकर्ता www-data / apache के लिए निष्पादन) होना चाहिए यदि PHP स्क्रिप्ट ब्राउज़र या कर्ल में चलती है) और / या "निष्पादन योग्य" होना चाहिए। .pyफ़ाइल में सभी आदेशों में सही विशेषाधिकार होने चाहिए:

Php मैनुअल से लिया गया :

यूनिक्स-प्रकार प्लेटफ़ॉर्म पर शेल_सेक्स का उपयोग करने की कोशिश करने वालों के लिए बस एक त्वरित अनुस्मारक यह काम करने के लिए नहीं मिल सकता है। PHP सिस्टम पर वेब उपयोगकर्ता के रूप में निष्पादित होता है (आमतौर पर Apache के लिए www), इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि शेल या नेटेक कमांड में आप जिस भी फाइल या निर्देशिका का उपयोग करने का प्रयास कर रहे हैं, वेब उपयोगकर्ता के पास उसके अधिकार हैं। अन्य बुद्धिमान, यह कुछ भी नहीं करते दिखाई देंगे।

यूनिक्स-प्रकार प्लेटफार्मों पर एक फ़ाइल को निष्पादन योग्य बनाने के लिए :

chmod +x myscript.py

6
धन्यवाद, कि चाल किया! एक और समस्या थी - अपाचे उपयोगकर्ता पायथन लिपि में एक कमांड निष्पादित करने में सक्षम नहीं था, लेकिन मैं सूडो का उपयोग करके और सुडो फाइल के लिए अपनी स्क्रिप्ट के लिए अपवाद जोड़कर इसे ठीक करने में सक्षम था। एक बार फिर धन्यवाद! :)
खाता

1
मैं अपाचे उपयोगकर्ता की एक ही समस्या का सामना कर रहा हूं, क्या आप मुझे मार्गदर्शन कर सकते हैं?
एम्मा

1
मैंने आपके उत्तर का उपयोग किया, यह अजगर लिपि को ठीक करता है, लेकिन मैं परिणाम को वेब पेज में प्रकट नहीं कर सकता, क्या आप मेरी मदद कर सकते हैं।
हम्दी चेज़र

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");
साइबोर्ग

23

मैं 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

एलेजांद्रो ने इसे अपवाद (उबंटू या डेबियन) में स्पष्टीकरण जोड़ते हुए कहा - मेरे पास जवाब देने के लिए जोड़ने के लिए प्रतिनिधि नहीं है:

sudoers फ़ाइल: sudo visudo

अपवाद जोड़ा गया: www-data ALL=(ALL) NOPASSWD: ALL


7
यह sudoers में www-data को जोड़ने के लिए प्रभावी नहीं लगता है, और अपाचे को अधिक अनुमतियाँ देता है जिनकी उसे आवश्यकता होती है। आपके द्वारा निष्पादित स्क्रिप्ट पर www-data अनुमतियाँ देना पर्याप्त होगा।
जेसन डाल्टन

शांत विचार, लेकिन निश्चित रूप से आपके सिस्टम को कमजोर बना सकता है। मैं @JasonRDalton से सहमत हूं
रीड

6

यह स्पष्ट करने के लिए कि स्थिति के आधार पर किस कमांड का उपयोग करना है

exec() - एक बाहरी कार्यक्रम निष्पादित करें

system() - एक बाहरी कार्यक्रम निष्पादित करें और आउटपुट प्रदर्शित करें

passthru() - एक बाहरी कार्यक्रम निष्पादित करें और कच्चे आउटपुट प्रदर्शित करें

स्रोत: http://php.net/manual/en/function.exec.php


4

मेरे मामले में मैं में एक नया फ़ोल्डर बनाने के लिए आवश्यक wwwनिर्देशिका कहा जाता है scripts। भीतर scriptsमैंने एक नई फ़ाइल जोड़ी, जिसका नाम है test.py

मैंने तब इस्तेमाल किया sudo chown www-data:root scriptsऔर sudo chown www-data:root test.py

फिर मैं नई scriptsनिर्देशिका में गया और इस्तेमाल किया sudo chmod +x test.py

मेरी test.py फ़ाइल यह इस तरह दिखता है। विभिन्न पायथन संस्करण पर ध्यान दें:

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

Php से मैं अब यह करता हूँ:

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

और आपको देखना चाहिए: हैलो वर्ल्ड!


3

उपरोक्त विधियाँ जटिल प्रतीत होती हैं। संदर्भ के रूप में मेरी विधि का उपयोग करें।

मेरे पास ये दो फाइलें हैं:

  • run.php

  • mkdir.py

यहां, मैंने एक HTML पृष्ठ बनाया है जिसमें एक GOबटन है। जब भी आप इस बटन को दबाएंगे एक नया फ़ोल्डर निर्देशिका में बनाया जाएगा जिसका पथ आपने उल्लेख किया है।

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

यह बहुत तुच्छ है, लेकिन अभी किसी को भी मदद करना चाहता था जो पहले से ही अलेजांद्रो के सुझाव का पालन करता था, लेकिन इस त्रुटि का सामना करना पड़ा:

sh: blabla.py: कमांड नहीं मिला

अगर किसी को उस त्रुटि का सामना करना पड़ा, तो एलेजैंड्रो द्वारा php फ़ाइल में थोड़ा बदलाव करने की आवश्यकता है:

$command = escapeshellcmd('python blabla.py');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.