Move_uploaded_file "स्ट्रीम खोलने में विफल: अनुमति अस्वीकृत" त्रुटि देता है


143

मैं अपाचे 2.2 और PHP 5.3 के साथ अपलोड निर्देशिका को सेंटोस पर कॉन्फ़िगर करने का प्रयास करते समय यह त्रुटि प्राप्त करता रहता हूं।

Php.ini में:

upload_tmp_dir = /var/www/html/mysite/tmp_file_upload/

Httpd.conf में:

Directory /var/www/html/mysite/tmp_file_upload/>
    Options  -Indexes
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
<Directory /var/www/html/mysite/images/>
                Options -Indexes
</Directory>

CentOS निर्देशिका अनुमतियाँ:

drwxrwxr-x 2 root root 4096 Nov 11 10:01 images
drwxr-xr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload

कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, मुझे फ़ाइल अपलोड करते समय PHP से यह त्रुटि मिलती रहती है:

चेतावनी: Move_uploaded_file (छवियाँ / robot.jpg): स्ट्रीम खोलने में विफल: 78/ लाइन पर /var/www/html/mysite/process.php में अनुमति देने से इनकार

चेतावनी: Move_uploaded_file (): 78 पर लाइन पर / चित्र / robot.jpg में / images / robot.jpg पर / tmp / phpsKD2Qm को स्थानांतरित करने में असमर्थ।

जैसा कि आप देख सकते हैं, यह अपलोड फ़ाइल के बारे में php.ini फ़ाइल से कॉन्फ़िगरेशन कभी नहीं लिया।

मुझसे यहां क्या गलत हो रहा है?


775? हो सकता है कि आपका सर्वर कोई नहीं चल रहा हो। केवल रूट इस मामले में लिख सकता है (आपकी "छवियां" अनुमतियाँ) ...
कोनराड बोरोवस्की

इसका क्या मतलब है ? मैं इसे बदलने में किस तरह सक्षम हूं ?
user63898

याद रखें कि सभी मूल निर्देशिकाओं के लिए भी सही अनुमतियाँ होना आवश्यक है।
श्रीधर सरनोबत

जवाबों:


188

इसका कारण यह है imagesऔर tmp_file_uploadकेवल द्वारा लिखने योग्य हैं rootउपयोगकर्ता। काम करने के लिए अपलोड करने के लिए हमें उन फ़ोल्डरों के मालिक को httpd प्रक्रिया के मालिक के रूप में बनाने की आवश्यकता है या उन्हें विश्व स्तर पर लिखने योग्य (बुरा अभ्यास) बनाने की आवश्यकता है।

  1. अपाचे प्रक्रिया के मालिक की जाँच करें $ps aux | grep httpd:। पहला कॉलम मालिक होगा आमतौर पर यह होगाnobody
  2. के स्वामी को बदलने imagesऔर tmp_file_uploadबन जा करने के लिए nobodyया जो कुछ भी मालिक आपने चरण 1 में पाया।

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
  3. चामोद imagesऔर tmp_file_uploadअब मालिक द्वारा योग्य होने के लिए, यदि आवश्यक हो [लगता है कि आपके पास पहले से ही यह जगह है]। @Dmitry Teplyakov उत्तर में उल्लेख किया गया।

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
  4. अधिक जानकारी के लिए कि यह व्यवहार क्यों ख़ुशी देता है, मैन्युअल http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir पर ध्यान दें, यह भी open_basedirनिर्देश के बारे में बात कर रहे हैं ।


4
धन्यवाद: हमारे पुराने मालिक डेमॉन थे अब यह अपाचे है
zzapper

यह फिक्स उन स्थितियों पर लागू होता है जहाँ आप सर्वरों को ph_CGI, CGI से Apache_mod में plesk आदि के रूप में बदल सकते हैं। मूल उपयोगकर्ता की अनुमति के साथ जारी रख सकते हैं। इससे मेरे मुद्दे तय हो गए।
दीर्घवृत्त

1
मुझे यह एक ही त्रुटि आ रही है लेकिन प्रक्रिया और फ़ोल्डर्स दोनों के स्वामित्व में हैं jacob(जैसा कि यह मेरी स्थानीय मशीन है) और सभी के पास फ़ोल्डर हैं 755या 775
limeandcoconut

sudo service httpd restartअनुमति बदलने के बाद मुझे अपनी अपाचे प्रक्रिया को फिर से शुरू करना पड़ा । फिर इसने काम किया :) मालिक बदलने के बजाय chownमैंने अपनी अपाचे प्रक्रिया को एक 'www' समूह में जोड़ा और इन निर्देशिकाओं को उसी 'www' समूह में जोड़ाchgrp
Ali Saeed

76

अपाचे प्रक्रिया के मालिक का पता लगाने के लिए आप इस स्क्रिप्ट को भी चला सकते हैं:

<?php echo exec('whoami'); ?>

और फिर गंतव्य निर्देशिका के मालिक को जो आपने प्राप्त किया है उसे बदल दें। कमांड का उपयोग करें:

chown user destination_dir

और फिर कमांड का उपयोग करें

chmod 755 destination_dir

गंतव्य निर्देशिका की अनुमति को बदलने के लिए।


3
धन्यवाद यह मेरे लिए काम करता है। मैंने पहली बार Laith Shadeed की विधि का उपयोग किया था, लेकिन ps aux टाइप करते समय मुझे वही परिणाम नहीं मिलता है grep httpd और <?php echo exec('whoami'); ?>। क्या किसी को पता है क्यों?
कूकिंसुला

1
ps aux | grep https वेब सर्वर के मालिक का नाम नहीं लौटाता है। यह करता है: ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' grep -v रूट | सिर -1 | cut -d \ -f1 Fron Symfony doc।
डेविड जैक्वेल

1
ध्यान दें कि उपरोक्त कमांड में, "-d \" और "-f1" के बीच दो स्थान होने चाहिए। यदि आप कॉपी-पेस्ट करते हैं, तो आपको "कट: खराब सीमांकक" जैसी त्रुटि मिल सकती है।
बीजोर

1
प्लस 1 के लिए exec('whoami')। मुझे 30 और मिनट बचाया। उबंटू उपयोगकर्ता को चुन रहा था
देवल खंडेलवाल

11
यह होना चाहिए www-data? आमतौर पर
मैक्सिमम

18

यदि आपके पास मैक ओएस एक्स है, तो फ़ाइल रूट या अपनी वेबसाइट के फ़ोल्डर पर जाएं।

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


जब आप लिनक्स सिस्टम के बारे में सवाल कर रहे हैं तो आप मैक ओएस पर टिप्पणी क्यों कर रहे हैं?
केमेक्सनर

7
हाय हाकर, आपके उत्तर के लिए धन्यवाद। मैं मैक पर हूँ और आपके उत्तर ने मेरी समस्या हल कर दी। बहुत बहुत धन्यवाद।
संजय शर्मा

2
इस जवाब से प्यार है
एलेक्सी श।

2
@Kmeixner लिनक्स के बारे में यह सवाल है, लेकिन मेरे OSX पर ठीक यही मुद्दा था। /private/var/tmpअपने मैक पर फ़ोल्डर में लेखन विकल्प बदलने के बाद इस टिप्पणी ने मेरे लिए काम किया, इसके लिए धन्यवाद ।
सलाम

यह एक पुरानी पोस्ट है, लेकिन यह वही है जो मुझे करने की आवश्यकता थी। धन्यवाद
TheRobQ

14

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

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www

फिर लॉगआउट या रिबूट।

यदि SELinuxशिकायत है, तो निम्नलिखित प्रयास करें

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'

मेरी जान बचाई :) .. मैं अपनी वेब परिनियोजित करने के लिए जीआईटी के बाद के हुक का उपयोग करता हूं, और हर बार जब मैं तैनात करता हूं तो मुझे उसकी अनुमति से वंचित करने की त्रुटि मिलती है, git उपयोगकर्ता को www-data में जोड़ा जाता है :) धन्यवाद
Zalaboza

यह सबसे अच्छा जवाब है।
saviour123

12

मैं इसे पिछले सुझावों में जोड़ना चाहता था। यदि आप लिनक्स के एक संस्करण का उपयोग कर रहे हैं जिसमें SELinux सक्षम है तो आपको इसे शेल में भी निष्पादित करना चाहिए:

chcon -R --type httpd_sys_rw_content_t /path/to/your/directory

अपने वेब सर्वर उपयोगकर्ता की अनुमति या तो समूह के माध्यम से या निर्देशिका के मालिक को बदलने के साथ।


restorecon -R -v /path/to/your/directoryशायद बाद में इसमें शामिल होने की भी जरूरत है। access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
Absolute

बहुत अच्छी तरह से सच हो सकता है, लेकिन मैं इस धारणा के तहत था कि चोंक ने "बदले हुए संदर्भ" को बदल दिया था। आप "सीमेन फ़ॉन्तेक्स्ट" का उपयोग करते हुए पहले देख रहे हैं जो इसे कुछ सेटिंग्स फ़ाइल "file_contexts.local" में डालता है, हालांकि यह कभी भी संदर्भ नहीं बदलता है।
क्रिस

@ क्रिस, धन्यवाद आदमी। इससे मेरी समस्या हल हो गई। क्या आप कृपया मामले पर कुछ प्रकाश डालेंगे? यह आदेश वास्तव में क्या करता है? मैं मैन पेज पर गया और यहाँ तक कि chcon के लिए जानकारी और आपके द्वारा दर्ज किए गए प्रकार का मूल्य नहीं पाया। मैं यहाँ थोड़ा भ्रमित हूँ।
जोकर

यह वेब सर्वर (httpd) द्वारा निर्देशिका या फ़ाइलों को पठनीय बनाता है ... मैं ईमानदारी से नहीं करना चाहता और शायद सेलेनक्स को समझा नहीं सकता क्योंकि मैं मुश्किल से इसमें खुद को समझता हूं ... कृपया nsa.gov/what-we-do देखें / अनुसंधान / सेलिनक्स
क्रिस

11

इस फ़ोल्डर के लिए अनुमतियाँ बदलें

# chmod -R 0755 /var/www/html/mysite/images/


1
क्या यह अब जैसा है: drwxrwxr-x 2 root 4096 Nov 11 10:01 चित्र भी: drwxrwxr-x 2 root 4096 Nov 12 04:54 tmp_file_upload लेकिन अभी भी वही त्रुटि है
user63898

7

इसे इस्तेमाल करे:

  1. open / etc / apache2 / envvars

    sudo gedit /etc/apache2/envvars
  2. www-dataअपने से बदलोyour_username

    "export APACHE_RUN_USER=www-data" 

    से बदलो

    export APACHE_RUN_USER='your_username' 

7

मैं पहले से ही सफलतापूर्वक संगीतकार चलाने के बाद भी इस संबंधित मुद्दे पर भाग गया। मैंने संगीतकार को अपडेट किया, और जब मैं चल रहा था composer installया php composer.phar installमुझे मिला:

... स्ट्रीम खोलने में विफल: अनुमति से इनकार ...

यह बहुत शोध के बाद पता चलता है कि फ़ोल्डर के लिए अनुमतियों को बदलने के बारे में पिछले उत्तर ने काम किया। वे अभी थोड़ा अलग निर्देशिका कर रहे हैं।

मेरे इंस्टॉल में, OS X पर, कैश फ़ाइल में है /Users/[USER]/.composer/cache, और मुझे परेशानी हो रही थी क्योंकि कैश फ़ाइल रूट के स्वामित्व में थी। मेरे उपयोगकर्ता के लिए '.composer' के स्वामित्व को बदलने से समस्या हल हो गई।

यह जो मैंने किया है:

sudo chown -R [USER] cache

फिर मैंने संगीतकार को फिर से स्थापित किया और वॉयला किया!


5

यह समस्या तब होती है जब Apache उपयोगकर्ता (www-data) को फ़ोल्डर में लिखने की अनुमति नहीं होती है। इस समस्या को हल करने के लिए आपको उपयोगकर्ता को समूह www-डेटा के अंदर रखना होगा।

मैंने अभी इसे बनाया है:

<?php echo exec('whoami'); ?>Apache द्वारा उपयोग किए गए उपयोगकर्ता को खोजने के लिए इस php कोड को निष्पादित करें । टर्मिनल में कमांड निष्पादित करने के बाद:

user@machine:/# cd /var/www/html

user@machine:/var/www/html# ls -l

यह कुछ इस तरह लौटेगा:

total of files

drwxr-xr-x 7 user group size date folder

मैंने उपयोगकर्ता रखा लेकिन समूह को www-डेटा में बदल दिया

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername

4

समाधान इतना आसान है। केवल IMAGE (गंतव्य) फ़ोल्डर पर राइट क्लिक करें, गुणों पर जाएं, अनुमति टैब पर क्लिक करें, और फ़ाइलों को बनाने और हटाने के लिए दूसरों तक पहुंच बदलें ।


सबसे तेज़ तरीका, केवल आप FTP के लिए GUI का उपयोग कर रहे हैं (FileZilla, WinSCP)
CLOUGH

3

बस tmp_file_upload की अनुमति को 755 में बदलें। कमांड chmod -R 755 tmp_file_upload है।


2

इसे इस्तेमाल करे

find /var/www/html/mysite/images/ -type f -print0 | xargs -0 chmod -v 664


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