2013-11-01 7 views
63

से एक अजगर स्क्रिप्ट चल रही है मैं निम्न आदेश का उपयोग कर PHP से एक अजगर स्क्रिप्ट चलाने के लिए कोशिश कर रहा हूँ:पीएचपी

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

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

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

उत्तर

98

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

PHP में: (see shebang explain):

#!/usr/bin/env python 

इसके अलावा अजगर फ़ाइल should have correct privileges (उपयोगकर्ता www-डेटा के लिए निष्पादन/अपाचे अगर पीएचपी

<?php 

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

?> 

अजगर फ़ाइल test.py में, पहली पंक्ति में इस पाठ को सत्यापित स्क्रिप्ट ब्राउज़र में या कर्ल के माध्यम से चलता है) और/या "निष्पादन योग्य" होना चाहिए। .py फ़ाइल में सभी आदेशों के लिए भी सही विशेषाधिकार होना चाहिए।

chmod +x myscript.py 
+6

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

+0

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

+1

मैंने आपके उत्तर का उपयोग किया, यह पायथन स्क्रिप्ट ठीक निष्पादित करता है लेकिन मैं वेब पेज में दिखाई देने वाले परिणामों को प्रतिबिंबित नहीं कर सकता, क्या आप मेरी मदद कर सकते हैं। पहली पंक्ति पर –

13

मैं passthru का उपयोग करना चाहिये और सीधे उत्पादन बफर से निपटने:

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

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

sudoers फ़ाइल: sudo visudo

अपवाद कहा: www-data ALL=(ALL) NOPASSWD: ALL

+5

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

8

आप आदेश की वापसी की स्थिति जानने और पूरे stdout उत्पादन आप वास्तव में exec उपयोग कर सकते हैं प्राप्त करना चाहते हैं:

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

$out सभी लाइनों की एक सरणी है। $status वापसी की स्थिति है। डीबगिंग के लिए बहुत उपयोगी है।

आप भी stderr उत्पादन या तो आप proc_open साथ बस जोड़ने के अपने $command लिए खेल सकते हैं या 2>&1 कर सकते हैं देखना चाहते हैं। उत्तरार्द्ध अक्सर चीजों को काम करने और "कार्यान्वित" करने के लिए तेज़ी से पाने के लिए पर्याप्त होता है।

0

मेरे मामले में मुझे 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); 

और तुम देखना चाहिए: नमस्ते दुनिया!