PHP mkdir: problem z odmową uprawnień

99

Próbuję utworzyć katalog z funkcji mkdir PHP, ale pojawia się błąd w następujący sposób: Warning: mkdir() [function.mkdir]: Permission denied in .... Jak rozwiązać problem?

folos
źródło
2
Platforma / serwer WWW / system operacyjny?
Salman A
1
sprawdź to pytanie: http://stackoverflow.com/questions/13908722/php-unable-to-create-a-directory-with-mkdir Miałem ten sam problem, a odpowiedź tutaj właśnie rozwiązała mój problem. Jeśli korzystasz z Linuksa, odpowiedź na temat SELinuksa może Cię dotyczyć.
Lucas Madureira,
spróbuj to działa dla mnie stackoverflow.com/a/12656964/7516620 wprowadź opis linku tutaj
Akshay Italiya

Odpowiedzi:

172

Wiem, że to stary wątek, ale potrzebuje lepszej odpowiedzi. Nie powinieneś ustawiać uprawnień na 777, jest to problem bezpieczeństwa, ponieważ daje dostęp do odczytu i zapisu na świecie. Może się zdarzyć, że twój użytkownik Apache nie ma uprawnień do odczytu / zapisu w katalogu.

Oto, co robisz w Ubuntu

  1. Upewnij się, że wszystkie pliki należą do grupy i użytkownika Apache. W Ubuntu jest to grupa i użytkownik www-data

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

  2. Następnie umożliwiono wszystkim członkom grupy www-data odczyt i zapis plików

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

Funkcja php mkdir()powinna teraz działać bez zwracania błędów

simpleengine
źródło
3
Dobra odpowiedź! Miejmy nadzieję, że z czasem trafi na górę strony!
Bardzo nieregularne
18
To bardzo zły pomysł .
Big McLargeHuge
Apache potrzebuje uprawnień do zapisywania takich rzeczy, jak pamięć podręczna i dzienniki ... to tylko kwestia dostrojenia.
Manatax,
@simpleengine Cześć, zauważyłem twoją odpowiedź. Mam ten sam problem z projektem, który próbuję stworzyć w CodeIgnterze i rozwijam w Ubuntu 14.14 Lts .. Czy mógłbyś dokładniej wyjaśnić mi kroki, które muszę wykonać zrobić, aby naprawić ten błąd ??? Aby dać ci dodatkowe informacje: absolutna ścieżka to /opt/lampp/htdocs/www/my-app/public/uploads.. Zasadniczo to, co próbuję zrobić, to przesłać pliki do folderu przesyłania, a także utworzyć foldery albumów (zostanie to zrobione za pomocą php) do przechowywania zdjęć ..
ltdev
6
Nie lubię użytkowników, którzy powtarzają „to niebezpieczne”, ale nie pokazują, jak to zrobić.
che-azeh
38

Późna odpowiedź dla osób, które w przyszłości znajdą to w Google. Napotkałem ten sam problem.

UWAGA: JESTEM NA MAC OSX LION

Dzieje się tak, że Apache jest uruchamiany jako użytkownik „_www” i nie ma uprawnień do edycji żadnych plików. Zauważysz, że ŻADNE funkcje systemu plików nie działają przez php.

Jak naprawić:

Otwórz okno wyszukiwarki i na pasku menu wybierz Idź> Idź do katalogu> / private / etc / apache2

teraz otwórz httpd.conf

odnaleźć:

User _www 
Group _www

zmień nazwę użytkownika:

User <YOUR LOGIN USERNAME>

Teraz zrestartuj Apache, uruchamiając ten terminal formularza:

sudo apachectl -k restart

Jeśli nadal nie działa, zdarza się, że wykonuję następujące czynności, zanim zrobię to powyżej. Może być powiązany.

Otwórz terminal i uruchom następujące polecenia: (uwaga, moje pliki serwera WWW znajdują się w / Library / WebServer / www. Zmień zgodnie z lokalizacją Twojej witryny)

sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
Chris Ingis
źródło
6
To rozwiązanie działa, ale pozwala Apache siać spustoszenie w systemie, jeśli ktoś zmusi go do wykonania złośliwego kodu (np. Za pomocą exploita Shellshock). Alternatywą byłoby pozostawienie wykonywania Apache jako _wwwi utworzenie grupy dla Ciebie i Apache. Stwórz nową grupę, powiedz „wezwana” trustedi umieść się _wwww niej. Następnie ustaw jako zaufanego właściciela grupy wszystkich plików w katalogu dokumentów serwera. Na koniec zrób chmod g+rwxw razie potrzeby tylko te pliki, do których Apache potrzebuje dostępu, aby trustedgrupa miała uprawnienia do edycji plików.
Chris Middleton
3
po prostu wbijając się, by jeszcze raz podkreślić, że ta odpowiedź to zły pomysł. istnieje wiele bardzo dobrych powodów, dla których procesy Apache są własnością ich własnych użytkowników specjalnego przeznaczenia.
danyamachine
16

Nie ustawiaj uprawnień na 777 podczas używania mkdir w PHP

Odpowiedzi zawierające tylko łącza nie są uważane za dobrą praktykę w StackOverflow, ale podana tutaj rada zasadniczo NIE powinna być stosowana.

Chciałbym wrócić do tej wspaniałej odpowiedzi na podobne pytanie . Cytuję:

Proszę, przestań sugerować użycie 777. Uczyniasz swój plik możliwym do zapisu przez wszystkich, co właściwie oznacza, że ​​tracisz wszelkie zabezpieczenia, dla których został zaprojektowany system uprawnień. Jeśli to zasugerujesz, pomyśl o konsekwencjach, jakie może to mieć na źle skonfigurowanym serwerze internetowym: niezwykle łatwo byłoby „zhakować” witrynę, nadpisując pliki. Więc nie rób tego.

Więdnąć
źródło
9

Fix uprawnienia katalogu próby utworzenia katalogu w .

Erik
źródło
Właśnie rozwiązałem problem w pierwotnym pytaniu, zmieniając rekurencyjnie uprawnienia do pliku 755, używając Filezilli. Kliknij prawym przyciskiem myszy folder nadrzędny, zakładając, że jest to jakiś ogólny folder repozytorium plików, dla którego można ustawić uprawnienia 755, następnie Atrybuty plików -> Wartość liczbowa -> 755, a następnie zaznacz „Rekurenuj w podkatalogach”. Jeśli masz dużo plików, propagacja przez podkatalogi zajmuje kilka minut. Następnie spróbuj ponownie.
TARKUS
7

Wiem, że ten wątek jest stary, ale może to komuś kiedyś pomoże.

Problem dlaczego PHP mówi "Odmowa uprawnień" dla mkdir () - zła ścieżka url. Aby to naprawić, wystarczy uzyskać prawidłową ścieżkę. Zrobiłem to w ten sposób:

<?php

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

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

?>
Boris
źródło
1
Zdarzyło mi się podczas przenoszenia do nowego hosta (który ma mysqlnd lol). Zapomniałem zmienić na nową pełną ścieżkę katalogu domowego. Okazuje się, że tak naprawdę nie był to problem z pozwoleniami.
JSG
2

Aby utworzyć katalog, musisz mieć uprawnienia systemu plików.

Przykład: W Ubuntu 10.04 apache (php) działa jako user: www-data w grupie: www-data

Oznacza to, że użytkownik www-data potrzebuje dostępu, aby utworzyć katalog.

Możesz spróbować samemu, używając: „su www-data”, aby stać się użytkownikiem www-data.

Jako szybką naprawę możesz zrobić: sudo chmod 777 my_parent_dir

Jon Skarpeteig
źródło
14
chmod 0777umożliwi odczyt i zapis na świecie! Nie powinieneś doradzać czegoś takiego. Jednak rada z grupą użytkowników jest obecnie najlepsza tutaj :)
KingCrunch
1
Jeśli świat ma dostęp do systemu operacyjnego, to jasne. Lepszym sposobem byłoby: sudo chown www-data: www-data my_parent_dir
Jon Skarpeteig
Lub zostaw uprawnienia w spokoju i dodaj dane www do grupy katalogu nadrzędnego.
Marc B
0

Inną rzeczą, którą możesz zrobić, jest przejście do: / etc / sudoers

Dodaj następujący wiersz, który daje uprawnienia temu użytkownikowi www-data ALL = (ALL: ALL) ALL Dlaczego dane www? dzieje się tak, ponieważ Apache działa pod tą nazwą użytkownika.

Jeśli twój użytkownik jest inny, wypróbuj nazwę użytkownika ALL = (ALL: ALL) ALL

To zadziałało dla mnie.

maxwells
źródło
5
nie edytuj sudoersbezpośrednio, ale zaloguj się jako root i użyj visudopolecenia te : które sprawdza wszelkie zmiany, aby uniknąć błędnych edycji, które mogą powodować błędy parsowania podczas ładowania pliku sudoers, co może pozostawić Cię bezsilnym (jak w przypadku braku uprawnień do zmienić cokolwiek)
Elias Van Ootegem,
Jak znaleźć nazwę użytkownika. jak www-data? Używam Nginx, ale nie działa
robspin
1
@robspin spróbuj tego: ps aux | egrep '(nginx)'
maxwells
0

Ponieważ korzystasz z komputera Mac, możesz dodać siebie do grupy _www (grupa użytkowników Apache) na komputerze Mac:

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

i dodaj użytkownika _www do grupy kół, która wydaje się być tym, co Mac tworzy pliki jako:

sudo dseditgroup -o edit -a _www -t user wheel
SeanJA
źródło
0

Mam ten problem właśnie teraz, moim najlepszym rozwiązaniem, jakie mogę Ci teraz dać (mimo że nie dołączyłeś żadnego kodu) to:

  1. Sprawdź, jak nazywasz folder docelowy, np .: nowy_folder (czasami może to powodować błąd w uprawnieniach, ponieważ większość hostów nie zezwala na tworzenie nazw z podkreśleniem, myślnikiem itp. W czasie wykonywania). U mnie to zadziałało.
  2. Jeśli używasz polecenia rekurencyjnego do tworzenia podfolderów, nie zapomnij umieścić 0755 (pamiętaj, aby na początku dołączyć 0) do polecenia mkdir, np:

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

To też działa dla mnie teraz.

arungisyadi
źródło
3
777 to problem z bezpieczeństwem
MaicolBen
Zmieniony przed
chwilą
0

Jeśli używasz LINUX-a, najpierw sprawdźmy użytkownika Apache, ponieważ w niektórych dystrybucjach może być inaczej:

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

Powiedzmy, że wynikiem jest „http”. Wykonaj następujące czynności, pamiętaj tylko o zmianie path_to_folder na ścieżkę folderów:

chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
Marcelo Agimóvel
źródło
0

sprawdź, czy to nie jest problem z 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);
            }
        }
    }
}
ceph3us
źródło
0

Po zainstalowaniu serwera ftp sudo apt-get install vsftpdbędziesz musiał go skonfigurować. Aby umożliwić zapis, musisz edytować /etc/vsftpd.confplik i odkomentować plik

#write_enable=YES

wiersz, więc powinien przeczytać

write_enable=YES

Zapisz plik i uruchom ponownie za vsftpdpomocą sudo service vsftpd restart.

Inne opcje konfiguracji można znaleźć w tej dokumentacji lubman vsftpd.conf

moim słońcem
źródło
0

Ten błąd występuje, jeśli używasz złej ścieżki.

Na przykład:

Używam systemu Ubuntu, a nazwa mojego folderu projektu to „myproject”

Załóżmy, że mam katalog myproject / public / report i chcę utworzyć nowy folder o nazwie zamówienia

Następnie potrzebuję całej ścieżki, na której istnieje mój projekt. Możesz uzyskać ścieżkę za pomocą polecenia PWD

Więc moja ścieżka główna będzie wyglądać następująco = '/ home / htdocs / myproject /'

$ dir = '/ home / htdocs / myproject / public / report / Orders';

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

To zadziała dla Ciebie !! Cieszyć się !!

Umang Soni
źródło