PHP mkdir: अनुमति से इनकार समस्या


99

मैं PHP mkdir फ़ंक्शन के साथ एक निर्देशिका बनाने की कोशिश कर रहा हूं, लेकिन मुझे निम्नानुसार एक त्रुटि मिलती है Warning: mkdir() [function.mkdir]: Permission denied in ...:। समस्या का निपटान कैसे करें?


2
प्लेटफ़ॉर्म / वेब सर्वर / ऑपरेटिंग सिस्टम?
सलमान ए

1
इस प्रश्न की जाँच करें: http://stackoverflow.com/questions/13908722/php-unable-to-create-a-directory-with-mkdir मुझे वही समस्या हो रही थी और यहाँ उत्तर ने मेरी समस्या ठीक कर दी। यदि आप linux पर runnig हैं, तो SELinux के बारे में उत्तर आपके लिए लागू हो सकता है।
लुकास मादुरिरा

जवाबों:


171

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

यहाँ आप उबंटू में क्या कर रहे हैं

  1. सुनिश्चित करें कि सभी फ़ाइलें Apache समूह और उपयोगकर्ता के स्वामित्व में हैं। उबंटू में यह www-data group और user है

    chown -R www-data:www-data /path/to/webserver/www

  2. अगला www-data समूह के सभी सदस्यों को फ़ाइलों को पढ़ने और लिखने में सक्षम बनाता है

    chmod -R g+rw /path/to/webserver/www

Php mkdir()फ़ंक्शन को अब त्रुटियों को वापस किए बिना काम करना चाहिए


3
अच्छा उत्तर! उम्मीद है कि यह समय के साथ पृष्ठ के शीर्ष पर अपना रास्ता बनाएगा!
अत्यधिक अनियमित


अपाचे को कैश और लॉग जैसी चीजों को लिखने की अनुमति की आवश्यकता है ... यह ठीक ट्यूनिंग की बात है।
मैनाटैक्स

@simpleengine हाय मैंने आपके उत्तर पर ध्यान दिया है .. मैं एक ऐसी समस्या का सामना कर रहा हूँ जो एक परियोजना के साथ मैं CodeIgnter में बनाने की कोशिश कर रहा हूं और Ubuntu 14.14 Lts में विकसित कर रहा हूं .. क्या आप कृपया मुझे और अधिक समझा सकते हैं, हालांकि मुझे जिन चरणों की आवश्यकता है इस त्रुटि को ठीक करने के लिए क्या करें ??? आपको कुछ अतिरिक्त जानकारी देने के लिए: पूर्ण पथ है /opt/lampp/htdocs/www/my-app/public/uploads.. मूल रूप से मैं जो करने की कोशिश कर रहा हूं, वह अपलोड फ़ोल्डर के अंदर फ़ाइलों को अपलोड करने के लिए उपयोगकर्ता में लॉग इन किया गया है और फ़ोटो संग्रहीत करने के लिए एल्बम-फ़ोल्डर भी बना सकते हैं (यह php के साथ किया जाएगा) ..
सुविवि 30'15

5
मुझे ऐसे उपयोगकर्ता पसंद नहीं हैं जो इसे करने का सुरक्षित तरीका दिखाए बिना "यह असुरक्षित है" कहते रहते हैं।
che-azeh

38

उन लोगों के लिए देर से उत्तर जो भविष्य में इसे Google के माध्यम से ढूंढते हैं। मैं एक समस्या मे फंस गया।

नोट: मैं मैक OSX शेर पर हूँ

क्या होता है कि अपाचे को उपयोगकर्ता "_www" के रूप में चलाया जा रहा है और किसी भी फाइल को संपादित करने की अनुमति नहीं है। आप देखेंगे कि कोई फ़ाइल सिस्टम फ़ंक्शन php के माध्यम से काम नहीं करता है।

कैसे ठीक करना है:

एक खोजक विंडो खोलें और मेनू बार से, Go> Go To Folder> / Private / etc / apache2 चुनें

अब httpd.conf खोलें

लगता है:

User _www 
Group _www

उपयोगकर्ता नाम बदलें:

User <YOUR LOGIN USERNAME>

अब इस फॉर्म टर्मिनल को चलाकर अपाचे को फिर से शुरू करें:

sudo apachectl -k restart

यदि यह अभी भी काम नहीं करता है, तो मैं ऊपर किए जाने से पहले निम्न कार्य करता हूं। संबंधित हो सकता है।

टर्मिनल खोलें और निम्नलिखित कमांड चलाएं: (ध्यान दें, मेरी वेबसर्वर फाइलें / लाइब्रेरी / वेबसर्वर / www में स्थित हैं। अपनी वेबसाइट के स्थान के अनुसार बदलें)

sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*

6
यह समाधान काम करता है, लेकिन अपाचे को आपके सिस्टम के साथ कहर बरपाने ​​की अनुमति देता है, किसी को इसे दुर्भावनापूर्ण कोड (जैसे शेलशॉक शोषण के माध्यम से) निष्पादित करना चाहिए। एक विकल्प यह होगा कि आपाचे को क्रियान्वित करना _wwwऔर आपके और अपाचे के लिए एक समूह बनाना। एक नया समूह बनाएं, कहते हैं trusted, और अपने आप को और _wwwइसमें डाल दिया । फिर अपने सर्वर दस्तावेज़ निर्देशिका में सभी फ़ाइलों के समूह के मालिक पर भरोसा करें। अंत में, chmod g+rwxकेवल उन फाइलों पर आवश्यक करें जिन्हें अपाचे को एक्सेस करने की आवश्यकता है, ताकि trustedसमूह के पास फ़ाइलों को संपादित करने की अनुमति हो।
क्रिस मिडलटन

3
बस फिर से जोर देकर कहा कि यह जवाब एक बुरा विचार है। कई बहुत अच्छे कारण हैं कि अपाचे प्रक्रियाएं अपने स्वयं के विशेष प्रयोजन उपयोगकर्ता के स्वामित्व में हैं।
डेनामैचिन

15

PHP में mkdir का उपयोग करते समय 777 की अनुमति न दें

लिंक केवल उत्तरों को स्टैकऑवरफ्लो पर अच्छा अभ्यास नहीं माना जाता है, लेकिन यहां दी गई सलाह का आमतौर पर पालन नहीं किया जाना चाहिए।

मैं इसी तरह के सवाल पर इस महान जवाब पर वापस लौटना चाहूंगा । मैं उद्धृत करता हूं:

कृपया 777 का उपयोग करने का सुझाव देना बंद कर दें। आप अपनी फ़ाइल को सभी के द्वारा लिखने योग्य बना रहे हैं, जिसका अर्थ है कि आप सभी सुरक्षा खो देते हैं जिसके लिए अनुमति प्रणाली डिज़ाइन की गई थी। यदि आप यह सुझाव देते हैं, तो उन परिणामों के बारे में सोचें जो खराब तरीके से कॉन्फ़िगर किए गए वेबसर्वर पर हो सकते हैं: फाइलों को अधिलेखित करके वेबसाइट को "हैक" करना अविश्वसनीय रूप से आसान हो जाएगा। तो, नहीं।


9

निर्देशिका की अनुमतियों को ठीक करें यदि आप एक निर्देशिका बनाने की कोशिश में


मैंने फ़ाइल की अनुमतियों को 755 के लिए पुन: फ़ाइल में बदलकर मूल प्रश्न में समस्या हल कर दी, फाइलज़िला का उपयोग करके। पैरेंट फोल्डर पर राइट क्लिक करें, यह मानते हुए कि यह किसी तरह की सामान्य फाइल रिपॉजिटरी फोल्डर है, जिस पर 755 परमिशन सेट करना ठीक है, फिर फाइल अटैचमेंट्स -> न्यूमेरिक वैल्यू -> 755, फिर "रिक डाइरेक्ट इन सब डाइरेक्टरीज़" को चेक करें। यदि आपके पास बहुत सी फाइलें हैं, तो उप निर्देशिकाओं के माध्यम से प्रचार करने के लिए कुछ मिनट लगते हैं। फिर पुनः प्रयास करें।
ताराकुस

7

मुझे पता है कि यह धागा पुराना है, लेकिन शायद इससे किसी को, एक दिन मदद मिलेगी।

समस्या क्यों mkdir के लिए "अनुमति अस्वीकृत" कहती है () - गलत यूआरएल पथ। तो, इसे ठीक करने के लिए, आपको सही रास्ता प्राप्त करने की आवश्यकता है। मैंने इसे इस तरह किया:

<?php

$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';

if( !file_exists($dir) ) {
    mkdir($dir, 0755, true);
}

?>

1
एक नए होस्ट (जिसमें mysqlnd lol है) को स्थानांतरित करते समय मुझे प्राप्त हुआ। मैं नए पूर्ण होम डाइरेक्टरी पथ को बदलना भूल गया। यह वास्तव में एक अनुमति समस्या नहीं थी।
जेएसजी

2

निर्देशिका बनाने के लिए आपके पास फ़ाइल सिस्टम की अनुमति होनी चाहिए।

उदाहरण: उबंटू में 10.04 अपाचे (php) उपयोगकर्ता के रूप में चलता है: www-data in group: www-data

मतलब निर्देशिका बनाने के लिए उपयोगकर्ता www-data की आवश्यकता है।

आप इसका उपयोग करके स्वयं प्रयास कर सकते हैं: www-data उपयोगकर्ता बनने के लिए 'su www-data'।

एक त्वरित सुधार के रूप में, आप यह कर सकते हैं: सुडोम चामोड 777 my_parent_dir


14
chmod 0777दुनिया को पढ़ने और लिखने की सुविधा देगा! आपको ऐसा कुछ करने की सलाह नहीं देनी चाहिए। हालाँकि, उपयोगकर्ता समूह के साथ सलाह वर्तमान में यहाँ सबसे अच्छी है :)
KingCrunch

1
अगर दुनिया में OS तक पहुँच है, तो सुनिश्चित करें। बेहतर तरीका यह होगा: sudo chown www-data: www-data my_parent_dir
जॉन

या अनुमतियों को अकेले छोड़ दें और मूल निर्देशिका के समूह में www-डेटा जोड़ें।
मार्क बी

0

दूसरी चीज जो आप कर सकते हैं वह है: / etc / sudoers

निम्नलिखित पंक्ति जोड़ें जो उस उपयोगकर्ता को अनुमति देता है www-data ALL = (ALL: ALL) ALL Why www-data? ऐसा इसलिए है क्योंकि इस उपयोगकर्ता नाम से अपाचे चल रहा है।

यदि आपका उपयोगकर्ता अलग है, तो यह जांचें कि उपयोगकर्ता नाम = (ALL: ALL) ALL

इसने मेरे लिए काम किया।


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

उपयोगकर्ता नाम कैसे खोजें www-data पसंद है? मैं nginx का उपयोग कर रहा हूं लेकिन काम नहीं कर रहा हूं
robspin

1
@robspin यह प्रयास करें: ps aux | egrep '(nginx)'
मैक्सवेल

0

जब से आप एक मैक पर हैं, आप अपने मैक पर _www (अपाचे उपयोगकर्ता समूह) समूह में खुद को जोड़ सकते हैं:

sudo dseditgroup -o edit -a $USER -t user _www

और पहिया समूह के लिए _www उपयोगकर्ता को जोड़ें जो ऐसा प्रतीत होता है कि मैक क्या फाइल बनाता है:

sudo dseditgroup -o edit -a _www -t user wheel

0

मुझे अभी यह समस्या है, मेरा सबसे अच्छा समाधान मैं आपको अभी दे सकता हूं (इसके बावजूद कि आपने अपना कोई कोड शामिल नहीं किया है) होगा:

  1. जांचें कि आप अपने गंतव्य फ़ोल्डर का नाम कैसे देते हैं, उदाहरण के लिए: new_folder (कभी-कभी यह अनुमति के लिए त्रुटि पैदा कर सकता है क्योंकि अधिकांश होस्ट अंडरस्कोर, डैश, आदि का उपयोग करके रन समय में बनाए जाने की अनुमति नहीं देते हैं)। इसने मेरे लिए काम किया।
  2. यदि आप उप-फ़ोल्डर बनाने के लिए पुनरावर्ती कमांड का उपयोग कर रहे थे, तो mkdir कमांड में 0755 (शुरू में 0 शामिल करना याद रखें) को रखना न भूलें, जैसे:

    if(!file_exists($output)){
        if (!mkdir($output, 0755, true)) {//0755
            die('Failed to create folders...');
        }
    
    }
    

यह भी मेरे लिए अभी काम किया है।


3
777 एक सुरक्षा समस्या है
MaicolBen

अभी-अभी संपादित, 0755 पर
arungisyadi

0

यदि आप LINUX का उपयोग कर रहे हैं, तो पहले अपाचे के उपयोगकर्ता की जांच करें, क्योंकि कुछ विकृतियों में यह अलग हो सकता है:

egrep -i '^user|^group' /etc/httpd/conf/httpd.conf 

मान लीजिए कि परिणाम "http" है। फोलोविंग करें, बस याद रखें path_to_folder को फ़ोल्डर पथ में बदलें:

chown -R http:http path_to_folder
chmod -R g+rw path_to_folder

0

जाँच करें कि क्या यह umask के साथ कोई समस्या नहीं है

if (!function_exists('mkdir_r')) {
    /**
     * create directory recursively
     * @param $dirName
     * @param int $rights
     * @param string $dir_separator
     * @return bool
     */
    function mkdir_r($dirName, $rights = 0744, $dir_separator = DIRECTORY_SEPARATOR) {
        $dirs = explode($dir_separator, $dirName);
        $dir = '';
        $created = false;
        foreach ($dirs as $part) {
            $dir .= $part . $dir_separator;
            if (!is_dir($dir) && strlen($dir) > 0) {
                $created = mkdir($dir, $rights);
            }
        }
        return $created;
    }
}

if (!function_exists('ensure_dir')) {
    /**
     * ensure directory exist if not create 
     * @param $dir_path
     * @param int $mode
     * @param bool $use_mask
     * @param int $mask
     * @return bool
     */
    function ensure_dir($dir_path, $mode = 0744, $use_mask = true, $mask = 0002) {
        // set mask 
        $old_mask = $use_mask && $mask != null
            ? umask($mask)
            : null;
        try {
            return is_dir($dir_path) || mkdir_r($dir_path, $mode);
        } finally {
            if ($use_mask && $old_mask != null) {
                // restore original
                umask($old_mask);
            }
        }
    }
}

0

आपके द्वारा ftp सर्वर को स्थापित करने के बाद आपको sudo apt-get install vsftpdइसे कॉन्फ़िगर करना होगा। लिखने की पहुंच को सक्षम करने के लिए आपको /etc/vsftpd.confफ़ाइल को संपादित करना होगा और इसे अनइंस्टॉल करना होगा

#write_enable=YES

लाइन, इसलिए इसे पढ़ना चाहिए

write_enable=YES

फ़ाइल सहेजें और के vsftpdसाथ पुनरारंभ करें sudo service vsftpd restart

अन्य कॉन्फ़िगरेशन विकल्पों के लिए इस दस्तावेज़ से परामर्श करें याman vsftpd.conf


0

यह त्रुटि तब होती है यदि आप गलत पथ का उपयोग कर रहे हैं।

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

मैं ubuntu प्रणाली का उपयोग कर रहा हूं और मेरे प्रोजेक्ट फ़ोल्डर का नाम 'myproject' है

मान लीजिए कि मेरे पास myproject / public / रिपोर्ट निर्देशिका मौजूद है और ऑर्डर नामक एक नया फ़ोल्डर बनाना चाहते हैं

फिर मुझे एक पूरे रास्ते की ज़रूरत है जहाँ मेरा प्रोजेक्ट मौजूद हो। आप पीडब्ल्यूडी कमांड द्वारा पथ प्राप्त कर सकते हैं

तो मेरा रूट पाथ होगा = '/ home / htdocs / myproject /'

$ dir = '/ home / htdocs / myproject / public / रिपोर्ट / आदेश';

if (!is_dir($dir)) {
   mkdir($dir, 0775, true);
}

यह आपके लिए काम करेगा !! का आनंद लें !!

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