2009-11-24 15 views
8

के लिए खोल कैसे बदलूं मैं एक ubuntu सर्वर पर php के exec() फ़ंक्शन का उपयोग करना चाहता हूं। समस्या यह है कि, मुझे हमेशा एक त्रुटि मिलती है, कि आदेश नहीं मिला है।/गूंज: उदाहरणमैं php के exec()

exec("echo 123"); 

प्रिंट का उपयोग कर

श के लिए नहीं मिला

मेरे लिए

, ऐसा लगता है php, श खोल उपयोग कर रहा है जब मैं पार्टी का उपयोग किया जा करना चाहते हैं । मैंने // etc/passwd में www-data के लिए खोल बदलने की कोशिश की, जो कि या तो मदद नहीं करता था।

क्या किसी के पास कोई विचार है कि समस्या कहां से आ रही है या मैं PHP के उबंटू उपयोगकर्ता के लिए खोल कैसे बदल सकता हूं।

धन्यवाद, टीमो


[संपादित करें]

हो सकता है कि इस मदद करता है:

मैं टीमो के रूप में ssh से एक bash स्क्रिप्ट कहते हैं, इस स्क्रिप्ट एक PHP स्क्रिप्ट है, जो कार्यकारी का उपयोग करता है कहते हैं। मुझे पता है, यह अजीब लगता है, लेकिन यह एक बड़े विकास पर्यावरण का हिस्सा है ...

बिंदु यह है कि, मैं निश्चित नहीं हूं, क्योंकि उपयोगकर्ता के अंदर स्क्रिप्ट निष्पादित किया गया है।


[संपादित करें]

अब तक मैं पता लगा है कि वहाँ एक और अधिकार शामिल समस्या होना चाहिए। भले ही मैं निष्पादन के भीतर से एक बैश स्क्रिप्ट test.sh (इसके पूर्ण पथ से!) को कॉल करने का प्रयास करता हूं, php test.php बस कहेंगे।

श: /test.sh:

उत्तर

0

नहीं मिला मुझे लगता है कि समस्या यह है कि वहाँ कोई $ पथ सेटअप है।

/usr/bin/mysql --user=asdf --password=asdf mydb < ./dump.sql

तब मैं इस (शेल की परवाह किए बिना) काम करेगा कल्पना:

पूर्ण पथ का उपयोग कर अपनी बाइनरी यानी /bin/गूंज

+0

जैसे त्वरित निष्पादन के लिए धन्यवाद के साथ बैश का आह्वान कर सकते हैं। दुर्भाग्य से, इसने समस्या को हल नहीं किया।/bin/echo या तो काम नहीं करता है। क्या मैं वास्तव में करना चाहता था asdf --password = इस /usr/bin/mysql --user = है asdf mydb <./dump.sql आप देख सकते हैं, मैं भी निरपेक्ष पथ का इस्तेमाल किया।गूंज इसे और अधिक सरल बनाने के लिए सिर्फ एक उदाहरण था ... शायद कोई अन्य विचार हो सकता है? – Timo

0

लिए यदि आप क्या करना चाहते है की कोशिश करो /usr/bin/mysql --user=asdf --password=asdf mydb < /full/path/to/dir/dump.sql

+0

ओह, और मुझे यकीन नहीं है कि वास्तव में PHP में खोल को कैसे सेट किया जाए, लेकिन आप पहली पंक्ति के रूप में "#!/Bin/bash" के साथ sh से एक स्क्रिप्ट को कॉल कर सकते हैं, अगर आपको वास्तव में बैश (और ' इसे करने का दूसरा तरीका नहीं है)। –

+0

समस्या यह नहीं है कि मेरा डंप नहीं मिला है, बल्कि mysql नहीं मिल सकता है ... – Timo

+0

यदि वास्तव में/usr/bin/mysql पर एक बाइनरी स्थापित है तो sh उसे मिल जाएगा और समस्या कुछ और है - जैसे कि सुरक्षित-मोड सक्षम है (सुरक्षित-मोड-निष्पादन-डीआईआर और इसी तरह के दस्तावेज़ों को चेकआउट करें)। जांच करने की एक और चीज open_basedir है, जो कि निष्पादन को भी सीमित कर सकती है। –

8

इसके बजाय shell_exec() आज़माएं। निष्पादन को आपके प्रोग्राम को निष्पादित करने के लिए किसी भी खोल का आह्वान नहीं करना चाहिए। वैकल्पिक रूप से, आप

exec("/bin/bash -c \"echo $foo > bar.txt'\"") 
+0

यह सिर्फ "sh:/bash: नहीं मिला" कहेंगे।/में सभी बाइनरी के लिए PHP खोजों की तरह दिखता है। php.ini में safe_mode_exec_dir कुछ भी सेट नहीं है, इसलिए मुझे लगता है कि इसका मतलब है, कोई प्रतिबंध नहीं है !? (इसे बदलने में मदद नहीं लगती है) – Timo

+2

मुझे सुरक्षित मोड के साथ कोई अनुभव नहीं है, इसलिए शायद यह आपकी समस्या है। इसे बंद करने का प्रयास करें? आपको वैसे भी इसका उपयोग नहीं करना चाहिए, यह दूर जा रहा है और शुरुआत से एक बुरा विचार था (अधिकांश PHP भाषा "विशेषताओं" की सूची) http://php.net/manual/en/features.safe-mode.php – Trey

+0

Didn किसी ने यह पहले से ही उल्लेख नहीं किया है - सहमत सुरक्षित मोड को हानिकारक माना जाता है। Safe_mode_exec_dir के बारे में, यदि सुरक्षित मोड चालू है और यह खाली पर सेट है तो यह समझाएगा (यदि आप कुछ भी चलाने के लिए चाहते हैं तो इसे// पर सेट करने की आवश्यकता होगी। मेरा सुझाव है कि आप इसे उस अर्थ में कुछ अर्थपूर्ण और आविष्कार करने की कोशिश करें। –

संबंधित मुद्दे