PHP स्क्रिप्ट बैश स्क्रिप्ट नहीं चला सकती है। sh: अनुमति से इनकार किया


14

मैं PHP से .sh स्क्रिप्ट को निष्पादित करने की कोशिश कर रहा हूं, हालांकि यह निष्पादित नहीं कर रहा है।

मैंने त्रुटि लॉग की जाँच की, और मुझे 'sh: अनुमति अस्वीकृत' त्रुटि मिल रही है। मैंने जाँच की जिसके तहत उपयोगकर्ता php चलाया जा रहा है, और यह अपाचे उपयोगकर्ता के तहत किया गया है।

मैंने अपाचे उपयोगकर्ता के लिए .sh के स्वामित्व को बदलने की कोशिश की, लेकिन कोई नतीजा नहीं निकला।

मैंने पहले सोचा था कि यह स्क्रिप्ट www / dir के बाहर थी, हालाँकि जब मैंने स्क्रिप्ट को उसी निर्देशिका में रखा था, तब भी त्रुटि दी जा रही है।

क्या SUDOers सूची में अपाचे उपयोगकर्ता को जोड़ने के अलावा इसका कोई समाधान है?

यदि मैं 'php फ़ाइल नाम। Php' कमांड का उपयोग करके पोटीन से लॉन्च करता हूँ तो यह स्क्रिप्ट ठीक चलती है।


3
क्या यह एक शेल स्क्रिप्ट या PHP फ़ाइल है? आपका अंतिम पैराग्राफ उस बारे में स्पष्ट नहीं है। इसके अलावा, क्या आपने xफ़ाइल पर अनुमतियाँ ( ) निष्पादित की हैं? क्या आपने स्क्रिप्ट व्याख्याकार को एक शबंग रेखा में निर्दिष्ट किया था?
डैनियल बेक

यह PHP से चलाने के लिए एक बैश स्क्रिप्ट है। हां मैंने इसे एक निष्पादन योग्य बनाया और मैंने स्क्रिप्ट दुभाषिया को निर्दिष्ट किया। यह सही ढंग से काम करता है जब मैं पोटीन से PHP स्क्रिप्ट निष्पादित करता हूं और बैश स्क्रिप्ट को कॉल किया जाता है और सही तरीके से चलता है। लेकिन अगर मैं इसके बजाय वेब स्क्रिप्ट से php स्क्रिप्ट चलाता हूं, तो यह bash स्क्रिप्ट को चलाने में विफल रहता है और यह त्रुटि तब से करेगा क्योंकि यह अपाचे उपयोगकर्ता के रूप में चल रहा है और उपयोगकर्ता जिसे मैं पोटीन में उपयोग नहीं करता हूं।
रॉबिन प्रेस्टो

1
कोशिश करो chmod 775 yourscript.sh। यह r-xउस फ़ाइल पर "अन्य" उपयोगकर्ताओं को अनुमति देगा (पढ़ें और निष्पादित करें)।
रिहुक

मैं इसे करने की कोशिश की। भाग्य नहीं .. मैं कल तक सटीक कारण नहीं जान सकता। मुझे अपने स्थान से लॉग तक पहुँच नहीं है। मैं तुम लोगों को वापस कर दूंगा। आपके सहयोग के लिए धन्यवाद। :)
रॉबिन प्रेस्टो

जवाबों:


10

निम्नलिखित सुझावों का प्रयास करें:

  • नीचे परीक्षण कमांड चलाने की कोशिश करें, और जांचें कि क्या यह काम किया है:
    • php -r "echo exec('whoami');"
  • सुनिश्चित करें कि सभी मूल निर्देशिकाओं और फ़ाइलों में कम से कम r-xध्वज अनुमतियाँ हैं:
    • chmod 755 dir; chmod 755 file
  • सुनिश्चित करें कि फ़ाइल का स्वामी आपका Apache उपयोगकर्ता है
    • +sफ़ाइल में एक ध्वज (sudo) जोड़ने की भी कोशिश करें (अनुशंसित नहीं):
      • chmod u+s file,
  • सुनिश्चित करें कि आपका PHP में नहीं चल रहा है safe_mode
  • सुनिश्चित करें कि स्क्रिप्ट आपकी अपाचे जड़ के अंदर है:
    • अन्यथा, इसके अंदर स्क्रिप्ट को स्थानांतरित करें,
    • या अपने अपाचे विन्यास में उस निर्देशिका को जोड़ें,
    • या इस निर्देशिका को अपने में जोड़ें include_path, उदाहरण के लिए:
      • php.ini फ़ाइल: include_path ".:/usr/local/lib/php:/your/dir"
      • या .htaccessफ़ाइल:php_value include_path ".:/usr/local/lib/php:/your/dir"
  • जांचें कि क्या आपका शेल /bin/shआपके अपाचे उपयोगकर्ता के लिए वैध (जैसे ) सेट है (उदाहरण के लिए: साथ जांचें finger)।
  • सुनिश्चित करें कि आपका php.iniउपयोग नहीं करता है: disable_functionsके लिए execसमारोह
  • यदि SELinux का उपयोग कर रहे हैं या selinux-utilsस्थापित किया जा रहा है (एक सुरक्षा-संवर्धित लिनक्स प्रणाली), चेक getenforce/ setenforceकॉन्फ़िगरेशन @Tonin उत्तर में वर्णित है ।

समस्या निवारण:

  • यदि आपने अपनी फ़ाइल php.iniया httpd.confफ़ाइल बदल दी है , तो वेब सर्वर को पुनरारंभ करना न भूलें,
  • अतिरिक्त विवरण के लिए अपनी अपाचे त्रुटि लॉग की जाँच करें।
  • अपने में सक्षम php.iniत्रुटियों (सभी तरह display_error, error_reporting, आदि)।

1
यह मेरी समस्या थी .. मूल निर्देशिका के पास निष्पादन अधिकार नहीं थे ... अब यह काम करता है! धन्यवाद! :)
रॉबिन प्रेस्टो

फिर भी मेरे लिए कोई भाग्य नहीं है :( कोई सुझाव? `` `[जड़ @ कीवी tmp] # ls -ld /?; Ls -ld / tmp; ls -ld / tmp / sleep; grep '^ p___ \ _ ^ safe_mode =' | /etc/php.ini dr-xr-xr-x। 27 रूट रूट 4096 सितंबर 3 12:31 / drwxrwxrwt। 4 रूट रूट 4096 सितंबर 3 15:45 / tmp -rwxr-xr-x। 1 रूट 24 सितंबर 3। 15:39 / tmp / sleep safe_mode = off शामिल_path = "/ tmp: / home / kiwi_build" `` `
pihentagy

1
अर्घ, सेटेनफोर्स ने इसे हल किया। OMG
pihentagy

13

इस तरह का एक मुद्दा आपके द्वारा उपयोग किए जाने वाले ओएस पर निर्भर हो सकता है और यह कैसे कॉन्फ़िगर किया गया है। कुछ लिनक्स डिस्ट्रोस (मुख्य रूप से आरएचईएल जैसे सेंटोस या फेडोरा पर आधारित) डिफ़ॉल्ट रूप से सक्रिय किए गए SELinux के साथ आते हैं। यह जाँच की जा सकती है, और अस्थायी रूप से बदल दिया जा सकता है, निम्न आदेशों के साथ:

root@ls:~# /usr/sbin/getenforce 
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce 
Permissive

आपके पास वर्तमान कॉन्फ़िगरेशन पर अधिक पूर्ण दृश्य भी हो सकता है:

root@ls:~# /usr/sbin/sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

/etc/selinux/configफ़ाइल को संपादित करके और SELINUXचर को permissiveया पर सेट करके इस परिवर्तन को स्थायी किया जा सकता है disabled

लेकिन, इस तरह के मुद्दे को हल करने का सही तरीका , यदि आप वास्तव में इस स्थिति में हैं, तो /var/log/audit/audit.logलॉग फ़ाइल की जांच करना है । इसमें SELinux नियमों से संबंधित सभी घटनाएँ होंगी। तब आप शायद अपनी स्क्रिप्ट को सही संदर्भ दे सकते हैं, अर्थात अपाचे / php उपयोगकर्ता द्वारा चलाने के लिए अधिकृत किया जा रहा है। SELinux सुरक्षा प्रसंग की जाँच ls -Zनिम्न के साथ की जाती है :

root@ls:~# ls -alZ /var/www/cgi-bin/
drwxr-xr-x  root root system_u:object_r:httpd_sys_script_exec_t .
drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t ..

यह प्रत्येक फ़ाइल / निर्देशिका के उपयोगकर्ता, भूमिका और प्रकार को सूचीबद्ध करता है। यहाँ httpd_sys_script_exec_tप्रकार cgi निर्देशिका में फ़ाइलों को httpd द्वारा निष्पादित करने की अनुमति देता है। आपकी शेल स्क्रिप्ट में शायद एक ही प्रकार होना चाहिए।

आप कमांड audit.logको लाइनें भी फीड कर सकते हैं audit2allow। यह आपको SELinux को खुश करने के लिए आवश्यक परिवर्तनों का उत्पादन करेगा। लेकिन आमतौर पर सुझाए गए परिवर्तनों को SELinux नीति पर ही करने की आवश्यकता होती है जो कि आपके मामले में आपको क्या करना चाहिए (फिर भी, यह आउटपुट क्या चल रहा है, इसके बारे में कुछ सुराग दे सकता है)।

निम्न पृष्ठ एक समान समस्या और इसे हल करने के विभिन्न तरीकों का वर्णन करता है: http://sheltren.com/stop-diseable-selinux


विस्तृत उत्तर के लिए धन्यवाद! काश, जैसे मैंने उल्लेख किया कि मैं कल तक रूट एक्सेस नहीं कर सकता। तो मैं भी आपके पास वापस आ जाऊंगा! :) और हाँ, मैं CentOS का उपयोग कर रहा हूँ।
रॉबिन प्रेस्टो

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

कोई चिंता नहीं, आपको मेरी पोस्ट से जानकर खुशी हुई!
टोनिन

यदि समस्या को लागू किया जाता है, तो यह वास्तव में स्पष्ट नहीं है कि बिल्ली क्या चल रही है। इसने मेरा दिन बचाया!
pihentagy

1

इसलिए मैं Google पर इसी तरह के मुद्दे की खोज करने के बाद यहां आया हूं। मुझे लगता है कि SELinux के बारे में टिप्पणी ने मुझे सही दिशा में ले जाने के बारे में सोचा।

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

root@ls:~# /usr/sbin/setenforce Permissive मेरे लिए समस्या हल हो गई।


0

मेरी स्थिति थोड़ी अलग है, लेकिन Google ने मुझे यहां लाया, इसलिए मैंने सोचा कि मैं साझा करूंगा ...

मेरा सर्वर डिबियन स्थिर चल रहा है और शेल स्क्रिप्ट को निष्पादित करने की कोशिश कर रहा है, एक बार काम करने की अनुमति फिर से स्वचालित रूप से बदलकर 644 हो गई और स्क्रिप्ट को चलाने का अगला प्रयास मिल गया Permission denied। यह मेरे लिए एक सांबा सर्वर मुद्दा निकला और मैंने अब तक पैटर्न को नोटिस नहीं किया।

Windows संपादक से सांबा विभाजन पर फ़ाइल सहेजते समय QA अजीब अनुमति परिवर्तन ठीक था। मुझे map archive = noएक दशक तक सांबा के शेयरों का उपयोग करने के बाद भी विकल्प के बारे में नहीं पता था ।

विंडोज डेस्कटॉप पर नोटपैड ++ का उपयोग करने के बारे में कुछ 775 के बजाय लक्ष्य फ़ाइलों की अनुमतियों को 675 में बदल देगा क्योंकि उमस्क के लिए सेट किया गया है।


-7

अपाचे के माध्यम से PHP में रूट कमांड चलाना

मेरे पास एक वेब एप्लिकेशन है जो एक PHP फ़ंक्शन के भीतर शेल कमांड के रूप में रूट करने की आवश्यकता है, और आपको लगता है कि यह बहुत सीधे होगा ... लेकिन यह सभी विवरण प्राप्त करने के लिए मेरे कुछ googles ले गया, इसलिए यहां मेरे काम के नोट्स हैं यह। यह अपाचे पर चलने वाले एक लिनक्स सिस्टम पर है, और हम कमांड चलाने के लिए "shell_exec" के भीतर "sudo" का उपयोग करेंगे।

मुख्य बात यह है कि / etc / sudoers फ़ाइल को संपादित करना है, और आम तौर पर आप ऐसा कर सकते हैं (रूट के रूप में) ऐसा करने के लिए "visudo" कमांड का उपयोग करें।

सुनिश्चित करें कि अपाचे कमांड चला सकते हैं, और पासवर्ड की आवश्यकता नहीं है:

apache  ALL=(ALL)       NOPASSWD: ALL

फिर आपको इस लाइन पर टिप्पणी करने की आवश्यकता है:

#Defaults    requiretty

यदि आप नहीं करते हैं, तो आप इन त्रुटियों को / var / log / safe में देखेंगे: "क्षमा करें, आपके पास sudo चलाने के लिए एक ट्टी होनी चाहिए"। अब आप जाने के लिए तैयार हैं, और PHP कोड सरल है:

$ परिणाम = shell_exec ('sudo date');


5
यह एक भयानक विचार है। यदि आपके एपाचे इंस्टॉल से समझौता हो जाता है या आपके द्वारा चलाए जा रहे एप्लिकेशन ... आपके हैकर को बहुत आसानी से सिस्टम तक पूरी पहुंच मिल जाती है। सही बात स्क्रिप्ट पर अनुमतियों को बदलने के लिए है, न बातें खुली छोड़
जर्नीमैन गीक

2
मैं अपाचे उपयोगकर्ता / भूमिका सभी अनुमतियों के साथ स्पष्ट सुरक्षा चिंताओं के कारण इस उत्तर पर एक डाउनवोट जारी करने के लिए बाध्य महसूस करता हूं।
रामहुंड

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