file_put_contents - nie udało się otworzyć strumienia: odmowa uprawnień

98

Próbuję napisać zapytanie do pliku w celu debugowania. Plik jest w formacie database/execute.php. Plik, do którego chcę pisać, to database/queries.php.

Próbuję użyć file_put_contents('queries.txt', $query)

Ale dostaję

file_put_contents (queries.txt) [function.file-put-content]: nie udało się otworzyć strumienia: Odmowa uprawnień

Mam queries.txt plik chmod'd to 777, jaki może być problem?

Hailwood
źródło
Czy przejrzałeś php.iniplik w poszukiwaniu czegokolwiek, co mogłoby uniemożliwić dostęp do pliku?
Hello71,
2
upewnij się również, że katalog jest poprawnie ustawiony
Crayon Violent
1
spróbuj także użyć bezwzględnej nazwy pliku. Może być tak, że Twoja interpretacja bieżącego folderu różni się od PHP
laher
1
Czy możesz dwukrotnie sprawdzić ten status chmod?
Jonah,
1
Istnieje lista kontrolna rozwiązywania problemów dla tego rodzaju problemów: stackoverflow.com/questions/36577020/ ...
Vic Seedoubleyew

Odpowiedzi:

74

Spróbuj dostosować uprawnienia do katalogu.

z terminala, uruchom chmod 777 database(z katalogu zawierającego folder bazy danych)

apache i nikt nie będzie miał dostępu do tego katalogu, jeśli jest on poprawnie chmoddowany.

Inną rzeczą do zrobienia jest echo "getcwd ()". Spowoduje to wyświetlenie aktualnego katalogu, a jeśli to nie jest „/something.../database/”, musisz zmienić „query.txt” na pełną ścieżkę do serwera.

Jason
źródło
105
Czy 777 nie jest zagrożeniem dla bezpieczeństwa?
hitautodestruct
12
Podejrzewam, że nie tylko katalog docelowy musi być zapisywalny przez konto na serwerze, ale każdy katalog nadrzędny katalogu docelowego musi zezwalać kontu serwera na przejście do niego; Myślę, że byłoby to + x do uprawnień.
Erhannis
2
Eksperymentowałem z teoriami Erhannisa na nowym stosie LAMP i teoria jest słuszna.
thotheolh
4
Myślę chmod +x /parent/directory, że @MajidFouladpour dla każdego katalogu nadrzędnego celu. chmod +x /parent/directory, chmod +x /parentitp.
Erhannis
1
Jest teraz lista kontrolna rozwiązywania problemów tego rodzaju: stackoverflow.com/questions/36577020/ ...
Vic Seedoubleyew
19

Druga opcja

jest to, co możesz zrobić Apache (www-data), właścicielem folderu

sudo chown -R www-data:www-data /var/www

to powinno file_put_contentsdziałać teraz. Ale dla większego bezpieczeństwa lepiej również ustaw uprawnienia, jak poniżej

find /var/www -type d -print0 | xargs -0 chmod 0755 # folder
find /var/www -type f -print0 | xargs -0 chmod 0644 # files
  • przejdź /var/wwwdo głównego folderu plików php
azerafati
źródło
7

Uświadom sobie, że jest to już dość stare, ale nie ma potrzeby ręcznego zapisywania zapytań do takiego pliku. MySQL ma wbudowaną obsługę logowania, wystarczy ją włączyć w swoim środowisku deweloperskim.

Zapoznaj się z dokumentacją „ogólnego dziennika zapytań”:

http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Adam
źródło
3

Chłopaki, miałem ten problem przez 1 miesiąc i zrobiłem wszystko, ale nie mogłem go naprawić, ale teraz znam rozwiązanie.

Używam współdzielonego hostingu linux, kiedy mój administrator zmienił php na 5.3, otrzymałem wiele błędów w kodzie "file_put_contents". spróbuj przetestować mój plan:

Na swoim hoście utwórz plik taki jak mytest.php, umieść ten kod i zapisz:

<?php        mail('Your-EMail','Email-Title','Email-Message');        ?>

Otwórz adres URL „www.twoja-domena.com/mytest.php” jeden raz, a następnie sprawdź pocztę. powinieneś otrzymać e-mail od swojego hosta z informacjami, które wpisałeś w mytest.php, sprawdź nazwę nadawcy. jeśli pochodzi od Nikogo , masz problem z „Odmową uprawnień”, ponieważ coś nie zostało zdefiniowane i jeśli nazwa nadawcy jest taka jak moja id: [email protected], nie masz problemu.

Mój administrator zmienił serwer i ponownie zainstalował hosta. Myślę, że problem został rozwiązany, powiedz administracji hosta, co ci powiedziałem, a może znajdą odpowiedź.

mam nadzieję, że ci to pomoże!

Hesam
źródło
Jestem kompletnie zagubiony !! Co próbujesz powiedzieć? Jeśli mówisz, że użytkownik Apache nie był w stanie uzyskać nazwy hosta na serwerze (udostępnionym lub czymkolwiek), to najwyższy czas, aby ponownie rozważyć wybór usługi hostingowej.
Fr0zenFyr
3

Wiem, że to bardzo stare pytanie, ale chciałem dodać dobre rozwiązanie z pewnym szczegółowym wyjaśnieniem. Będziesz musiał wykonać dwie instrukcje na systemach podobnych do Ubuntu, a wtedy działa jak urok.

Uprawnienia w Linuksie można przedstawić za pomocą trzech cyfr. Pierwsza cyfra określa uprawnienia właściciela plików. Druga cyfra to uprawnienia określonej grupy użytkowników. Trzecia cyfra określa uprawnienia dla wszystkich użytkowników, którzy nie są właścicielem ani członkiem grupy.

Serwer WWW ma działać z identyfikatorem będącym członkiem grupy. Serwer sieciowy nie powinien nigdy działać z tym samym identyfikatorem, co właściciel plików i katalogów. W Ubuntu uruchamia apache pod identyfikatorem www-data. Ten identyfikator powinien należeć do grupy, dla której określono uprawnienia.

Aby nadać katalogowi, w którym chcesz zmienić zawartość plików, odpowiednie uprawnienia wykonaj polecenie:

find %DIR% -type d -exec chmod 770 {} \;

W przypadku PO oznaczałoby to, że uprawnienia do katalogu% ROOT% / database powinny zostać odpowiednio zmienione. Dlatego ważne jest, aby w tym katalogu nie znajdować się pliki, które nigdy nie powinny być zmieniane ani usuwane. Dlatego najlepszą praktyką jest utworzenie oddzielnego katalogu dla plików, których zawartość musi zostać zmieniona.

Uprawnienia do odczytu (4) dla katalogu oznaczają możliwość gromadzenia wszystkich plików i katalogów wraz z ich metadanymi w katalogu. Uprawnienia do zapisu (2) pozwalają na zmianę zawartości katalogu. Oznacza to dodawanie i usuwanie plików, zmianę uprawnień itp. Uprawnienie do wykonywania (1) oznacza, że ​​masz prawo wejść do tego katalogu. Bez tego ostatniego nie można zagłębić się w katalog. Serwer WWW potrzebuje uprawnień do odczytu, zapisu i wykonywania, gdy zawartość pliku powinna zostać zmieniona. Dlatego grupa potrzebuje cyfry 7.

Drugie stwierdzenie dotyczy PO:

find %DOCUMENT_ROOT%/database -type f -exec chmod 760 {} \;

Umiejętność odczytu i zapisu dokumentu jest wymagana, ale nie jest wymagana do wykonania pliku. 7 jest przyznawane właścicielowi plików, 6 - grupie. Serwer WWW nie musi mieć uprawnień do wykonania pliku, aby zmienić jego zawartość. Te uprawnienia do zapisu należy nadawać tylko plikom w tym katalogu.

Wszystkim innym użytkownikom nie należy nadawać żadnych uprawnień.

Dla katalogów, które nie wymagają zmiany swoich plików, wystarczające są uprawnienia grupowe o wartości 5. Dokumentacja dotycząca uprawnień i kilka przykładów:

https://wiki.debian.org/Permissions

https://www.linux.com/learn/tutorials/309527-understanding-linux-file-permissions

http://www.linux.org/threads/file-permissions-chmod.4094/

Loek Bergman
źródło
3

Zbieranie informacji z tego linku stackoverflow-zapisywanie obrazu nie działa z chmod 777 i od użytkownika azerafati i Loek Bergman

jeśli zajrzysz do pliku / etc / apache / envvars, zobaczysz coś takiego:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Apache działa pod nazwą użytkownika „www-data”

„0755” oznacza, że ​​właściciel pliku może czytać / zapisywać / wykonywać, ale grupa i inni użytkownicy nie mogą pisać. więc w terminalu ur, przejdź do folderu zawierającego folder „images”. następnie wpisz:

find images -type d -exec chmod 0755 {} \;
find images -type f -exec chmod 0755 {} \;
sudo chown -R www-data:www-data images

musisz najpierw zmienić uprawnienia, zanim zmienisz właściciela. wprowadź swoje hasło po wyświetleniu monitu. spowoduje to, że „www-data” stanie się właścicielem folderu obrazów.

Twoje przesyłanie powinno teraz działać.

Bruce Tong
źródło
1

Dla każdego, kto używa Ubuntu i otrzymuje ten błąd podczas lokalnego ładowania strony, ale nie w usłudze hostingowej,

Właśnie to naprawiłem, otwierając nautilus ( sudo nautilus) i klikając prawym przyciskiem myszy plik, który próbujesz otworzyć, kliknij właściwości> Ustawienia> i daj odczyt i zapis wszystkim innym

d -_- b
źródło
0

miał ten sam problem; moim problemem był selinux został ustawiony na egzekwowanie.

Ciągle otrzymywałem błąd „nie udało się otworzyć strumienia: odmowa uprawnień” nawet po podkodowaniu do 777 i upewnieniu się, że wszystkie foldery nadrzędne mają uprawnienia do wykonywania dla użytkownika Apache. Okazuje się, że moim problemem było to, że selinux został ustawiony na wymuszanie (jestem na centos7), to jest devbox, więc go wyłączyłem.

DaveS
źródło
0

Można to rozwiązać, wykonując następujące czynności:

1. $ php artisan cache:clear

2. $ sudo chmod -R 777 storage

3. $ composer dump-autoload

Mam nadzieję, że to pomoże


źródło
0

Jeśli pobierasz z gita z lokalnego na serwer, czasami będziesz musiał wyczyścić pamięć podręczną ze względu na pliki widoku, które są przesyłane z nim / lub inne pliki w pamięci podręcznej.

php artisan cache:clear

Czasami może to po prostu działać, jeśli aplikacja działała przed ściągnięciem git

Deepesh Thapa
źródło
0

to może pomóc. U mnie to zadziałało. spróbuj w terminalu

setenforce 0

Joseph litewski
źródło
-2

Istnieją 2 sposoby rozwiązania tego problemu
1. użyj chmod 777 path-to-your-directory.
jeśli to nie zadziała,
2. podaj po prostu pełną ścieżkę do pliku query.txt.

Salman Mohammad
źródło
2
To strasznie niepewna i wyjątkowo zła praktyka. Jest również trudny do wykrycia i poprawienia podczas tworzenia aplikacji niestandardowych i można go łatwo przeoczyć. Znajdź odpowiednie uprawnienia.
ftrotter
-3

Tutaj rozwiązanie. Aby skopiować obraz z adresu URL. ten adres URL:http://url/img.jpg

$image_Url=file_get_contents('http://url/img.jpg');

utwórz żądaną ścieżkę zakończ nazwę za pomocą .jpg

$file_destino_path="imagenes/my_image.jpg";

file_put_contents($file_destino_path, $image_Url)
masterhoo
źródło
-11

Ponadto, jak wspomniano file_put_contents man pagew php.net, uważaj na problemy z nazwami.

file_put_contents($dir."/file.txt", "hello");

może nie działać (nawet jeśli jest poprawna w składni), ale

file_put_contents("$dir/file.txt", "hello");

Pracuje. Doświadczyłem tego na różnych serwerach z zainstalowanym php.

Kivanc
źródło
17
To nie jest poprawne. $dir."/file.txt"jest funkcjonalnie równoważne "$dir/file.txt"we wszystkich przypadkach, przy założeniu, że $dirjest łańcuchem. Ponadto, jak twierdzi Kivanc, takie zachowanie nie jest udokumentowane na php.net.
mattbasta