Linux Ubuntu पर php shell_exec () अनुमति


13

मैं लिनक्स सर्वर का उपयोग करके php एप्लिकेशन विकसित कर रहा हूं। मेरी समस्या shell_exec()कुछ exe फ़ाइल को कॉल करने के लिए निष्पादित हो रही है काम नहीं कर रही है (वास्तव में exe नहीं है, यह लिनक्स निष्पादन योग्य फ़ाइल की तरह है)

echo shell_exec("whoami");

मुझे डेमॉन मिल गया

echo shell_exec("ls")

मुझे कुछ फ़ाइलनाम मिला लेकिन

echo shell_exec("php -v")

मुझे कुछ नहीं मिला, एक कोरा पृष्ठ

echo shell_exec("php ....bla bla bla")

एक रिक्त पृष्ठ भी।

ये सभी कमांड अगर मैं टर्मिनल पर टाइप करता हूं (यूजर हू) काम करेगा। मैंने कई घंटों के लिए Google खोज की है, लोग कहते हैं कि अनुमति के कारण। मुझे लिनक्स पर अनुभव नहीं है। Php में अपने प्रोग्राम को निष्पादित करने के लिए मुझे क्या करना होगा?

जवाबों:


10

अपाचे के उपयोगकर्ता www-dataको कुछ अनुप्रयोगों का उपयोग करने के लिए विशेषाधिकार प्रदान करने की आवश्यकता है sudo

  1. कमांड चलाएं sudo visudo। वास्तव में हम फ़ाइल को संपादित करना चाहते हैं etc/sudoers। ऐसा करने के लिए, sudo visudoटर्मिनल में उपयोग करके , इसे sudoersसंपादित करने के लिए डुप्लिकेट (अस्थायी) फ़ाइल।
  2. फ़ाइल के अंत में, निम्न पूर्व जोड़ें: restart-यदि हम धूम्रपान करने के लिए कमांड का उपयोग करना चाहते हैं और phpआपके प्रश्न में एक और कार्रवाई के लिए कमांड,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php

(यह मान लिया गया है कि आप सुपर उपयोगकर्ता (रूट) विशेषाधिकारों का उपयोग करके चलाना restartऔर phpकमांड करना चाहते हैं। और आप पथ phpमें कमांड का उपयोग करते हैं usr/bin/)

हालांकि, यदि आप सुपर उपयोगकर्ता विशेषाधिकारों का उपयोग करके हर एप्लिकेशन को चलाना चाहते हैं, तो ऊपर दिए गए के बजाय निम्नलिखित जोड़ें। आप ऐसा नहीं करना चाह सकते, न कि ALLआदेशों के लिए, बहुत खतरनाक।

www-data ALL=NOPASSWD: ALL

3. sudoers फ़ाइल को संपादित करने के बाद ( visudoहम sudoersफ़ाइल को लिखने के लिए temp फ़ाइल को सहेजने और छोड़ने के लिए अस्थायी फ़ाइल संपादित करते हैं) sudoers( wq!) ।

4. यह क्या है, अब अपनी स्क्रिप्ट के अंदर exec()या shell_execनिम्न तरीके से उपयोग करें xxx.phpphp स्क्रिप्ट में कमांड के उपयोग sudoसे पहले उपयोग करना याद रखें ।

उदाहरण के लिए: -

exec ("sudo /etc/init.d/smokeping restart 2>&1");

या

shell_exec("sudo php -v"); 

इसलिए अपनी समस्या में, आप जो भी जोड़ना चाहते हैं, उसमें कमांड जोड़िए और जो आप चाहते हैं, उसमें step no (2.)अपनी php स्क्रिप्ट बदलें।

यहाँ आपकी /programming//a/22953339/1862107 जैसी ही समस्या है


यह प्रश्न सूडो के उपयोग के बारे में नहीं है।
त्रिकसे

यह इतनी बुरी तरह से कहा जाता है
बार्नी चेम्बर्स

5

संपूर्ण पथ को php बाइनरी निर्दिष्ट करने का प्रयास करें .. जैसे, /usr/bin/php

यदि आप इसे नहीं जानते हैं, तो इसका उपयोग करें: which php


इको शेल_एक्सेक ("/ usr / बिन / php -v"); काम नहीं करता है।
nahoaho91

जब आप कहते हैं 'काम नहीं करता' तो आपको क्या मिलता है? यानी, कोई त्रुटि? आपके php / अपाचे त्रुटि लॉग में कुछ भी? यदि पृष्ठ रिक्त है, तो स्रोत आपको काम करने के लिए कुछ भी देता है? दुर्भाग्य से यह शब्द 'काम नहीं करता है' हमें काम करने के लिए कुछ भी नहीं देता ...
कीरन होलोवे

@ ngoaho91 - आमतौर पर लॉग होते हैं /var/log/httpd/error*
स्लम

: D मुझे खाली पृष्ठ मिला, कुछ नहीं देखना है। जहाँ php / apache त्रुटि लॉग फ़ाइल है?
ngoaho91

@ ngoaho91 - लिनक्स डिस्ट्रो क्या है? CentOS, उबंटू?
स्लम

4

आप आम तौर पर अनुप्रयोगों जैसे , और whoami, के लिए पूर्ण पथ निर्दिष्ट करना चाहते हैं । यदि आप अनिश्चित हैं कि किसी कार्यक्रम का स्थान (पूर्ण पथ) क्या है तो आप इसका पता लगा सकते हैं:lsphp

$ type php
php is /usr/bin/php

फिर इसे अपनी स्क्रिप्ट में इस तरह निर्दिष्ट करें।

<?php
    echo shell_exec("/usr/bin/php ....bla bla bla");
?>

मैं आपकी आज्ञा चलाता हूँ। type php => php is / usr / bin / php है। लेकिन पूर्ण पथ कमांड अभी भी मुझे एक खाली पृष्ठ लौटाता है।
ngoaho91

यदि आप ऐसा करते हैं: तो क्या होगा echo shell_exec("/usr/bin/php somefile.php 2>&1")?
स्लम

echo shell_exec ("/ usr / bin / php index.php 2> & 1") => / usr / bin / php: स्थानांतरण त्रुटि: / usr / bin / php: प्रतीक X509_free, संस्करण OPENSSL_1.0.0 फ़ाइल libcrypto में परिभाषित नहीं है। so.1.0.0 लिंक समय संदर्भ के साथ
ngoaho91

ठीक है, वेब सर्वर (अपाचे) आम तौर पर किसी अन्य उपयोगकर्ता के रूप में चल रहा है, नहीं hu। तो आपको यह सुनिश्चित करने की आवश्यकता है कि स्क्रिप्ट phpचलाने का प्रयास इस तरह सेट किया गया है chmod 755 somescript.php:। यह उपयोगकर्ता को अपाचे के रूप में चल रहा है, जो आपकी .phpफ़ाइल को निष्पादित और पढ़ने में सक्षम होने की अनुमति देगा ।
स्लम

1
@ ngoaho91 - अब सब कुछ ठीक होना चाहिए, यह त्रुटि बताती है कि कुछ गलत w / आपका Apache / PHP सेटअप है। freetutorialssubmit.com/php-relocation-error/2221
SLM

2

क्या आपका php.ini उपलब्ध कमांड सेट को प्रतिबंधित करता है?

यह मेरे से है /etc/php5/php.ini

; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
; http://php.net/safe-mode-exec-dir
safe_mode_exec_dir =

नहीं, मेरे ini के रूप में अपने
ngoaho91

2

शेल_एक्सच मुद्दों को डीबग कैसे करें

ठीक है, यहाँ हमारे पास एक समस्या है: कुछ चीज़ टर्मिनल में काम करती है और php के शेल_एक्सईसी (या निष्पादन, स्पॉन, जो भी हो) में काम नहीं करती है। आइए सोचते हैं: आप और php में क्या अंतर है? यहाँ तीन हैं:

PHP को HTTP सर्वर नियमों से निष्पादित किया जाता है

वास्तव में, आपका टर्मिनल yournameउपयोगकर्ता से चल रहा है और php से निष्पादित किया गया है www-data। इसलिए, पहला विचार www-dataउपयोगकर्ता से टर्मिनल खोलना और एक ही कमांड का प्रयास करना है। इसलिए....

  • /etc/passwdफ़ाइल खोलें , www-dataउपयोगकर्ता के साथ लाइन ढूंढें और इसे /bin/false(या जो भी) से लॉगिन शेल (पिछले एक) को बदलें /bin/bash
  • www-dataटर्मिनल खोलें :su www-data
  • Php -v या जो भी आप php से निष्पादित नहीं कर सकते हैं, कोशिश करें। यदि यह काम नहीं करता है - तो आप अच्छे लॉग देखेंगे और समस्या को डीबग करने में सक्षम होंगे।
  • /etc/passwdजब आप काम कर रहे हों तो बैक फाइल को ठीक करना न भूलें

PHP को PHP से निष्पादित किया जाता है

PHP अपभ्रंश है और अपाचे / nginx और php.ini कॉन्फ़िगरेशन में बहुत सारे विकल्प हैं जो आपके प्रयास को प्रभावित कर सकते हैं।

यह डिबग करने के लिए थोड़ा अधिक जटिल है। यहां दो विकल्प हैं:

  • ब्राउज़र में लॉग सक्षम करें और समस्या देखें। ब्राउज़र में त्रुटियों को देखने के लिए अपने को संपादित करें php.ini, चालू करें display_errorsऔर अन्य सभी झंडे। वे आप पढ़ सकते हैं और उन्हें डिबग कर सकते हैं।

  • प्राप्त www-dataखोल (प्रथम खंड देखें) और कुछ निष्पादित करें

echo '<?php shell_exec("php -v"); ?>' | php

जो कंसोल में एक ही php कोड निष्पादित करेगा और आप त्रुटियों और डिबग को देख पाएंगे।

PHP को SELinux / apparmor से निष्पादित किया जाता है

सेलिनक्स और एपरमोर सुरक्षा चीजें हैं जो विशिष्ट कार्यों को करने के लिए अनुप्रयोगों को मना करती हैं (उदाहरण के लिए, अन्य अनुप्रयोगों या कुछ अन्य विशिष्ट अनुप्रयोगों को पैदा करना)। शायद यह आपके सर्वर पर सक्षम है।

जाँच करने के लिए - selinux / apparmor को निष्क्रिय करें और जाँच करें कि क्या समस्या मौजूद है।

ठीक करने के लिए - उचित मैनुअल पढ़ें और अपने मामले के लिए अनुमत नियम लिखें।


0

मेरे लिए सबसे सरल तरीका था php.ini के अंदर जाना और उस लाइन पर टिप्पणी करना जो इसके साथ शुरू होती है

disable_functions
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.