Wątek przeniesiony 2021-02-01 20:35 z Hardware/Software przez somekind.

Zmiana praw dostępu dla grupy

0

Witam,
Już za dużo czasu straciłem na tą pierdołę, więc muszę zapytać. Jak dla grupy www-data zmienić uprawienia, bo utworzy mi plik ale nie zapisze nic do niego, wiem że należy zmienić uprawienia, zmieniłem przez ftp dla całego folderu ale ten plik co się utworzy to i tak ma inne, wiec należy zmienić dla grupy, ale nie wiem jak, jak?

4

Spójrz na to inaczej - możesz dodać siebie do grupy https://www.howtogeek.com/50787/add-a-user-to-a-group-or-second-group-on-linux/ogeek.com/50787/add-a-user-to-a-group-or-second-group-on-linux/

usermod -a -G group1,group2,group3 exampleusername

No chyba, że koniecznie chcesz zmieniać grupę dla plików w katalogu Apache. Jeśli nie masz powodu to tego nie rób. Konfiguracja Apache albo jakieś zabezpieczenia mogą wymagać, żeby nikt inny nie wcinał się do katalogu serwera.

4

Logujesz się na serwer i używasz chmod. Chmod 777 nadaje uprawnienia dla wszystkich do wszystkiego. Wylisituj sobie najpierw informacje o katalogach przy użyciu ls -l. Możesz dodać używając chmod g+rw co doda rw dla grup. Możess też zmianiać wpisując cyfry jako parametry. Druga cyferka to uprawnienia dla grup. Wykonując chmod 747 zminiasz uprawnienia dla grup nadając im uprawniania 4.
Wydaje mi się jednak, że to kolejny X/Y i w kontekście innych pytań raczej zmieniłbym użytkownika z jakiego używasz cron aniżeli kombinował z uprawnieniami.
crontab -u <username> -e
Może jakiś artykuł o usprawnieniach przeczytaj najpierw np. https://www.pluralsight.com/blog/it-ops/linux-file-permissions

2

@jurek1980: Chodziło ci o to, żeby zalogować się jako właściciel plików albo root? Bo autor może tego nie załapać. Do liczenia numerków może mu się przydać http://permissions-calculator.org/
Ze zmianą uprawnień na plikach serwera jest mały problem. Serwer może je zmienić za jakiś czas. Dzieje się tak czasem przy rotowaniu logów. Swoją drogą co do crona, można napisać skrypt, który jako użytkownik www-data skopiuje pliki do innego katalogu i nada im uprawnienia dla innych albo zmieni właściciela.

0
PerlMonk napisał(a):

Spójrz na to inaczej - możesz dodać siebie do grupy www-data. Wtedy bedziesz mieć prawa do tych plików.

Rzuć okiem https://www.howtogeek.com/50787/add-a-user-to-a-group-or-second-group-on-linux/

usermod -a -G group1,group2,group3 exampleusername

No chyba, że koniecznie chcesz zmieniać grupę dla plików w katalogu Apache. Jeśli nie masz powodu to tego nie rób. Konfiguracja Apache albo jakieś zabezpieczenia mogą wymagać, żeby nikt inny nie wcinał się do katalogu serwera.

po Twoim poście użyłem
usermod -a -G www-data root
i działało, dzisiaj chcę uruchomić skrypt i jak wcześniej tworzy plik, ale nic nie zapisuje, więc znowu użyłem tej komendy i co? bez zmian, gdzie wczoraj pomogło. chmod nadałem pełne uprawienia dla katalogu czy pełne dla grupy i bez zmian. Ktoś wie co należy zrobić ?

3

@sentence: W ogóle zacznijmy od początku... Co za pliki modyfikujesz i po co chcesz je zmieniać? Serwer może ignorować zmiany dokonane w niektórych plikach. Np. logi - serwer do nich pisze i a potem ewentualnie zmienia nazwy. Apache zupełnie nie jest zainteresowany tym, co chcesz tam robić.
Dodałeś użytkownika root do grupy www-data. To jest bez sensu, bo root i tak ma dostęp wszędzie - nie ważne jakie są uprawnienia, root może wszystko (z paroma wyjątkami, ale to zupełnie inna sprawa). Jakim użytkownikiem logujesz się do serwera? Pewnie zwykłym a nie root, bo byś nie miał problemu.
Co do chmod, uprawnienia na katalog a na pliki to co innego. Jeśli utworzysz plik, to jesteś jego właścicielem i masz do niego prawa - najczęściej do odczytu i zapisu. Dlatego za każdym razem jak powstają nowe pliki, uprawnienia są na www-data.
Podkreślam: napisz co chcesz zrobić. Być może da się rozwiązać problem inaczej.

0

@PerlMonk:

PerlMonk napisał(a):

@sentence: W ogóle zacznijmy od początku... Co za pliki modyfikujesz i po co chcesz je zmieniać? Serwer może ignorować zmiany dokonane w niektórych plikach. Np. logi - serwer do nich pisze i a potem ewentualnie zmienia nazwy. Apache zupełnie nie jest zainteresowany tym, co chcesz tam robić.

Dodałeś użytkownika root do grupy www-data. To jest bez sensu, bo root i tak ma dostęp wszędzie - nie ważne jakie są uprawnienia, root może wszystko (z paroma wyjątkami, ale to zupełnie inna sprawa). Jakim użytkownikiem logujesz się do serwera? Pewnie zwykłym a nie root, bo byś nie miał problemu.
Co do chmod, uprawnienia na katalog a na pliki to co innego. Jeśli utworzysz plik, to jesteś jego właścicielem i masz do niego prawa - najczęściej do odczytu i zapisu. Dlatego za każdym razem jak powstają nowe pliki, uprawnienia są na www-data.
Podkreślam: napisz co chcesz zrobić. Być może da się rozwiązać problem inaczej.

mam plik formularz.php na VPS

<?php
	$pole1 = $_POST['pole1'];

	if(empty($pole1)) 
	{
		echo '<form action="" method="post">
		<input type="text" name="pole1" style="width: 200px;" /><br />
		<input type="submit" value="Zapisz" />
		</form>';
	}
	else 
	{
		$zapisz =  $pole1." -- ".date("H:i:s")." -- ".date("d.m.y")."\r\n";
		$data94 = dirname(__FILE__) . '/baza.txt';
		file_put_contents($data94, $zapisz);			
	}

?>

wywołuję adres_serwera/formularz.php i co bym nie wprowadził do formularza to nic do pliku nie zapisze, tyko go utworzy. Jak napisałeś pierwszy post to wywołałem usermod -a -G www-data root i działało, a na drugi dzień już nie, i ponownie wpisanie tego już nie działa. Cały folder w którym tworzy plik ma maksymalne uprawnienia, ale plik który się utworzy juz nie ma i należy do grupy www-data.

1

Uprawnienia są w porządku. Gdyby były nieprawidłowe, skrypt wysypałby się na funkcji file_put_contents i nie stworzył pliku wcale.
Wątek wygląda na pasujący na dział webmastering - z Linuksem być może nie ma nic do roboty.

2

Coś dziwnego dzieje Ci się z tym skryptem.

    $pole1 = $_POST['pole1'];// niezincjowane przy pierwszym wejściu.

Przy pierwszym wejściu nie ma jeszcze klucza pole1 w tablicy post. Powinno wyrzucić błąd. A skoro nie może raz przejść dalej, to nie powinno wejść w else i utworzyć pliku.
Sprawdzaj przez isset albo jakieś nullcolasing -?? Czy taki klucz istnieje.

2

@PerlMonk:
/var/log/apache2/access.log
W momencie w którym wywołam formularz access.log i error.log zmieni date na datę w momencie zapisania do formularza, ale do pliku nie dopisze się nic, jego rozmiar się nie zmieni.

3

@sentence: Kolega @jurek1980 dobrze podpowiedział. Funkcja empty nie wystarczy do sprawdzenia czy coś jest w zmiennej. Sprawdźmy:

<?php

$zmienna = '';

if (empty($zmienna)) {
	print "Zmienna jest pusta\n";
} else {
	print "W zmiennej coś jest " . $zmienna . "\n";
}


$zmienna = false;

if (empty($zmienna)) {
	print "Zmienna jest pusta\n";
} else {
	print "W zmiennej coś jest " . $zmienna . "\n";
}


$zmienna = 0;

if (empty($zmienna)) {
	print "Zmienna jest pusta\n";
} else {
	print "W zmiennej coś jest " . $zmienna . "\n";
}

?>

W wyniku dostaniesz:

$ php zmienna.php 

Zmienna jest pusta
Zmienna jest pusta
Zmienna jest pusta

Jeśli spojrzysz na https://www.php.net/manual/en/function.empty.php dowiesz się, że jest link https://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting . Tam jest napisane, że jedne wartości są traktowane inaczej, niż inne. Ty możesz mieć różne wyniki zależnie od tego, co wyślesz. Możesz sprawdzać to funkcją strlen, np.

<?php

$zmienna = '';
print "W zmiennej jest " . strlen($zmienna) . " znaków\n";

if (empty($zmienna)) {
	print "Zmienna jest pusta\n";
} else {
	print "W zmiennej coś jest " . $zmienna . "\n";
}


$zmienna = false;
print "W zmiennej jest " . strlen($zmienna) . " znaków\n";

if (empty($zmienna)) {
	print "Zmienna jest pusta\n";
} else {
	print "W zmiennej coś jest " . $zmienna . "\n";
}


$zmienna = 0;
print "W zmiennej jest " . strlen($zmienna) . " znaków\n";

if (empty($zmienna)) {
	print "Zmienna jest pusta\n";
} else {
	print "W zmiennej coś jest " . $zmienna . "\n";
}


?>

W wyniku dostaniesz:

$ php zmienna.php 
W zmiennej jest 0 znaków
Zmienna jest pusta
W zmiennej jest 0 znaków
Zmienna jest pusta
W zmiennej jest 1 znaków
Zmienna jest pusta

Na koniec jeszcze funkcja is_string https://www.php.net/manual/en/function.is-string.php :

<?php

$zmienna = '';
print "W zmiennej jest " . strlen($zmienna) . " znaków\n";

if (is_string($zmienna)) {
	print "Zmienna to string\n";
} else {
	print "To nie jest string!\n";
}


$zmienna = false;
print "W zmiennej jest " . strlen($zmienna) . " znaków\n";

if (is_string($zmienna)) {
	print "Zmienna to string\n";
} else {
	print "To nie jest string!\n";
}


$zmienna = 0;
print "W zmiennej jest " . strlen($zmienna) . " znaków\n";

if (is_string($zmienna)) {
	print "Zmienna to string\n";
} else {
	print "To nie jest string!\n";
}


?>

Wynik:

$php zmienna.php 
W zmiennej jest 0 znaków
Zmienna to string
W zmiennej jest 0 znaków
To nie jest string!
W zmiennej jest 1 znaków
To nie jest string!

No i masz różnicę :) . Teraz widzisz, że możesz mieć psikusa w kodzie?

2

Poza tym co napisał @PerlMonk przemyśl jak działa ten skrypt.
Na początku wchodzisz na jakiś adres strony. Formularza jeszcze nie ma, nie nacisnałeś też submit. Czyli na tym etapie cała tablica $_POST jest jeszcze pusta. Nie posiada żadnych kluczy. Odnosząc się więc do jakiegoś klucza powinieneś dostać błąd, tego klucza jeszcze nie ma. Dopiero jak wyświetlisz formularz i wywolasz submit, tablica $_POST będzie posiadać jakieś klucze.
W PHP możesz sprawdzić czy taki klucz jest ustawiony za pomocą isset lub array_key_exists.
Dopiero po sprawdzeniu czy klucz w ogóle istnieje możesz podjąć próbę odczytania jego wartości.
Inaczej za każdym razem przy wejściu skrypt na samym początku rzuci błąd i przestanie się dalej wykonywać.
Twój skrypt powinien rączej wyglądać tak:

$pole = false; 
if ( isset ($_POST['pole1']){
    $pole1 = $_POST['pole1'];
}
if($pole1)// tu warto sprawdzić nie tylko czy jest puste ale coś więcej
0

@PerlMonk:
co nie zmienia faktu że po dodaniu wczoraj
usermod -a -G www-data root działało za każdym razem
i lokalnie na Windowsie zawsze mi ten formularz dobrze działa do teraz.
Skoro jest błąd w kodzie to jak zmienić kod żeby to działało bo ja już nie wiem.

3

Dobrze, zróbmy to porządnie. Przeczytaj dokładnie cały kod, bo zrobiłem tam psikusa, żebyś musiał sam coś zmienić Utwórz sobie prawidłowy i pełny plik HTML, żeby mieć pewność, że formularz będzie prawidłowy

<!DOCTYPE html>
<html lang="pl">
<head>
	<meta charset="UTF-8">
	<title>Formularz</title>
</head>
<body>
<h1>Formularz</h1>
<form action="" method="post">
    <input type="text" name="pole1">
    <button type="submit">Wyślij</button>
</form>
</body>
</html>

Zapisz sobie ten plik jako np. form.html - potem użyjesz tej nazwy w pliku *.php, który wklejam poniżej:

<?php

$keyName = "dupa";// sialalala umpa umpa

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	//Skrypt teraz wie, że został wysłany formularz

	if (key_exists($keyName, $_POST) && is_scalar($_POST[$keyName])) {
		//Sprawdziliśmy czy do formularza zotało coś wpisane
		$fileContent = sprintf("%s -- %s\n", date("H:i:s"), $_POST[$keyName]);
		$fileName = dirname(__FILE__) . '/baza.txt';
		$bytesSaved = file_put_contents($fileName, $fileContent);

		//Sprawdzamy czy udało się zapisać dane do pliku
		if ($bytesSaved !== false) {
			printf("Zapisano %d bajtów do pliku %s. Nie bądź jak typowy student przed sesją!\n", $bytesSaved, $fileName);
		} else {
			print("Nie udało się zapisać pliku. Siała baba mak.");
		}
	} else {
		//Formluarz został wysłany, ale jest pusty
		print("Formularz przesłany, ale zawartość $keyName jest pusta!");
	}
} else {
	print(file_get_contents("dupa.html"));
}

Sprawdziłem to u siebie na Apache2 lokalnie. Plik się tworzy a dane w nim zostają.

0

@PerlMonk: Formularz przesłany, ale zawartość dupa jest pusta!

2

@sentence: Czyli skopiowałeś kod bez żadnej zmiany. Pisałem w poprzednim poście, że masz psikusa w kodzie :) . Słowo dupa jest w tym kodzie w dwóch miejscach. Pierwsze, na samej górze, zmień na pole1 a drugie, na końcu dupa.html zmień, żeby było form.html.
Na tym forum rzadko dajemy gotowce: albo ktoś chcę się nauczyć albo niech płaci. Jak chcesz się nauczyć to walcz. Jak chcesz gotowca, to płać :)

0

@PerlMonk:
Na VPS
Nie udało się zapisać pliku. Siała baba mak.

Lokalnie na Windows działa poprawnie, zresztą tak samo jak to stare

0

@sentence: W jakiej firmie masz tego VPS? Podejrzewam, że masz coś namieszane, bo w typowej instalacji ten skrypt zapisuje dane a tobie nie pozwala.

1

Spróbuj w takim razie dodać blok try catch

try{
    $bytesSaved = file_put_contents($fileName, 
    $fileContent);
}
catch(Exception $e){
   print_r($e->getMessage());
   echo exec('whoami');
   echo exec('ls -ld ../'); // tego nie jestem pewien ale powinno wyświetlić uprawnienia dla katalogu w jakim jesteś, w razie co zakomentuj.
}
0

@PerlMonk:
"Nom. Pewnie rozwiązanie jest proste, ale my nie wiemy o czymś ważnym a autor nie wie, że jest coś ważnego."

Tyko co takiego ważnego może być? Skoro podałem dokładny kod który wykonuje i cel co chce osiągnąć. Może faktycznie coś namieszane w ustawieniach, bo walczyłem długo z chmod na rożne sposoby zanim tu napisałem. Ale np. z consoli poleceniem echo "tekst" > baza.php tworzy normalnie, więc może grupa www-data nie ma uprawnień odpowiednich? Ale jak nadam uprawienia dla grupy chmod na 777 to i tak pusty plik który się utworzy ma -rw-r--r--

P.S i też uważał że rozwiązanie jest proste, bo zawsze na najprostszym schodzi mi najwięcej xd

2

To zrób na sztywno nowy plik test.php i wpisz tam tylko:

   echo exec('whoami');
   echo exec('ls -ld'); 

To powinno wyświetlić z jakiego użytkownika działa Ci ten serwer www i uprawnienia do katalogu.
Punkt dwa odszukaj logi PHP na serwerze i sprawdzaj co tam się pojawia.

2
jurek1980 napisał(a):

To zrób na sztywno nowy plik test.php i wpisz tam tylko:

   echo exec('whoami');
   echo exec('ls -ld'); 

To powinno wyświetlić z jakiego użytkownika działa Ci ten serwer www i uprawnienia do katalogu.
Punkt dwa odszukaj logi PHP na serwerze i sprawdzaj co tam się pojawia.

www-data
drwxrwxrwx 2 www-data www-data 12288 Feb 3 20:19 .
1

W logach nic nie przybywa jak wywołam.

2

@sentence: Skontaktuj się z dostawcą VPS. Podrzuć im skrypt, który Ci podałem, i napisz, że plik baza.txt (albo jakkolwiek go nazwałeś) nie jest uzupełniany o dane z formularza. Dostawca usług ma trochę więcej możliwości, niż my. Oni mogą się zalogować na twój serwer, my nie. No chyba, że w wiadomości prywatnej na forum dasz komuś hasło do użytkownika stworzonego w celu sprawdzenia tematu.
Jeśli uważasz, że zrozumiałeś mój post, proszę, żebyś napisał co zamierzasz zrobić. Moja prośba może wydawać Ci się dziwna, ale są w niej dobre intencje. Chcę, żebyś wykorzystał kanał informacji, za który płacisz (jako klient dostawcy VPS masz prawo zadawać pytania). Czy to jest jasne?

0
PerlMonk napisał(a):

@sentence: Skontaktuj się z dostawcą VPS. Podrzuć im skrypt, który Ci podałem, i napisz, że plik baza.txt (albo jakkolwiek go nazwałeś) nie jest uzupełniany o dane z formularza. Dostawca usług ma trochę więcej możliwości, niż my. Oni mogą się zalogować na twój serwer, my nie. No chyba, że w wiadomości prywatnej na forum dasz komuś hasło do użytkownika stworzonego w celu sprawdzenia tematu.

Jeśli uważasz, że zrozumiałeś mój post, proszę, żebyś napisał co zamierzasz zrobić. Moja prośba może wydawać Ci się dziwna, ale są w niej dobre intencje. Chcę, żebyś wykorzystał kanał informacji, za który płacisz (jako klient dostawcy VPS masz prawo zadawać pytania). Czy to jest jasne?

Nikt nie będzie o taką pierdołę grzebał na moim cennym VPS, problem będę męczył sam

1
sentence napisał(a):
PerlMonk napisał(a):

@sentence: Skontaktuj się z dostawcą VPS. Podrzuć im skrypt, który Ci podałem, i napisz, że plik baza.txt (albo jakkolwiek go nazwałeś) nie jest uzupełniany o dane z formularza. Dostawca usług ma trochę więcej możliwości, niż my. Oni mogą się zalogować na twój serwer, my nie. No chyba, że w wiadomości prywatnej na forum dasz komuś hasło do użytkownika stworzonego w celu sprawdzenia tematu.

Jeśli uważasz, że zrozumiałeś mój post, proszę, żebyś napisał co zamierzasz zrobić. Moja prośba może wydawać Ci się dziwna, ale są w niej dobre intencje. Chcę, żebyś wykorzystał kanał informacji, za który płacisz (jako klient dostawcy VPS masz prawo zadawać pytania). Czy to jest jasne?

Nikt nie będzie o taką pierdołę grzebał na moim cennym VPS, problem będę męczył sam

Jak na razie nie robisz tego do końca sam, bo pytasz nasz. Ale rozumiem. Jeśli nie chcesz współpracować, to widzę tylko jedną, wspomnianą wcześniej, możliwość pomocy. Tymczasem ja chcę skończyć z tym wątkiem.

1
PerlMonk napisał(a):
sentence napisał(a):
PerlMonk napisał(a):

@sentence: Skontaktuj się z dostawcą VPS. Podrzuć im skrypt, który Ci podałem, i napisz, że plik baza.txt (albo jakkolwiek go nazwałeś) nie jest uzupełniany o dane z formularza. Dostawca usług ma trochę więcej możliwości, niż my. Oni mogą się zalogować na twój serwer, my nie. No chyba, że w wiadomości prywatnej na forum dasz komuś hasło do użytkownika stworzonego w celu sprawdzenia tematu.

Jeśli uważasz, że zrozumiałeś mój post, proszę, żebyś napisał co zamierzasz zrobić. Moja prośba może wydawać Ci się dziwna, ale są w niej dobre intencje. Chcę, żebyś wykorzystał kanał informacji, za który płacisz (jako klient dostawcy VPS masz prawo zadawać pytania). Czy to jest jasne?

Nikt nie będzie o taką pierdołę grzebał na moim cennym VPS, problem będę męczył sam

Jak na razie nie robisz tego do końca sam, bo pytasz nasz. Ale rozumiem. Jeśli nie chcesz współpracować, to widzę tylko jedną, wspomnianą wcześniej, możliwość pomocy.

Chodziło mi o to że nie będę dawał dostępu nikomu do mojego VPS bo nie chce się niepotrzebnie narażać, dostawca też nie będzie grzebał. Prosiłeś żebym napisał co zamierzam zrobić to napisałem,. Oczywiście nie robię tego do końca sam, dużo mi pomagacie, za co bardzo dziękuję.

0

Ok, zrób sobie ostatni test i stwórz na sztywno piłk o możliwie unikalnej nazwie, gdzie zapiszesz również na sztywno jego treść. Coś w stylu:

        $fileContent = 'testowy zapis do pilku';
        $fileName = dirname(__FILE__) . '/baza'.time().'.txt';
        $bytesSaved = file_put_contents($fileName, $fileContent);
        if ($bytesSaved !== false) {
            printf("Zapisano %d bajtów do pliku %s. Nie bądź jak typowy student przed sesją!\n", $bytesSaved, $fileName);
        } else {
            print("Nie udało się zapisać pliku. Siała baba mak.");
        }

Bez żadnego formularza i kombinacji, że plik ma tą samą nazwę i zapis może blokować otwarcie go gdzieś indziej

0
jurek1980 napisał(a):

Ok, zrób sobie ostatni test i stwórz na sztywno piłk o możliwie unikalnej nazwie, gdzie zapiszesz również na sztywno jego treść. Coś w stylu:

        $fileContent = 'testowy zapis do pilku';
        $fileName = dirname(__FILE__) . '/baza'.time().'.txt';
        $bytesSaved = file_put_contents($fileName, $fileContent);
        if ($bytesSaved !== false) {
            printf("Zapisano %d bajtów do pliku %s. Nie bądź jak typowy student przed sesją!\n", $bytesSaved, $fileName);
        } else {
            print("Nie udało się zapisać pliku. Siała baba mak.");
        }

Bez żadnego formularza i kombinacji, że plik ma tą samą nazwę i zapis może blokować otwarcie go gdzieś indziej

Przez crona działa, przez php nazwa.php tez, przez przeglądarkę nie.

1

Ok. Może to Cię naprowadzi na rozwiązanie. Jak tworzysz plik z CMD to tworzysz go jak TY nie https://superuser.com/questions/509114/what-does-directory-permission-s-mean-not-lower-case-but-in-upper-caseto jakbyś był to TY.
Gdzieś rozjechały się ustawienia zupełnie.
Spróbuj jeszcze poprzestawiać uprawnienia z literka S.
https://superuser.com/questions/509114/what-does-directory-permission-s-mean-not-lower-case-but-in-upper-case

1 użytkowników online, w tym zalogowanych: 0, gości: 1