[ Predrag Supurovic @ 11.08.2019. 17:43 ] @
Imam web server koji se pokreće pod userom www-data koji je u grupi www-data. Na njemu se pokreće PHP skript koji čita podatke iz baze i na osnovu njega kreira u zadatom direktorijumu /cache/ poddirektorijume i datoteke.

Van sajta imam drugi skript koji se pokreće kao cron job, pod drugim userom, cron_user. Ovaj drugi skript radi neke obrade i puni pomenutu bazu podataka.

E sad skript koji ažurira bazu treba, kada završi ažuriranje baze, da pobriše sav sadržaj u direktorijumu koji generiše php skript.

Podesio sam da cron_user takođe bude u grupi www-data i grupi sam dodelio privilegije rwxrwxr-x nad direktorijumum rwxrwxr-x i ukljucio setgid (2775) kako bi se te privilegije prenosile na sve sto se kreira u tom direktorijumu. Medjutim, kada se pokrene php skript pod userom www-data, on kreira sav sadržaj ali sa privilegijama 2755, grupa ne dobija pravo pisanja. Tako cron job ne moze da brise taj adržaj.

Sa istim ovim podešavanjima, kada sa userom koji se koristi za cron job rucno kreiram dirketorijume i datoteke sa konzole, oni dobijaju prava 2775, kako je i očekivano. To ne radi samo ako datoteke i direktorijume kreira php skript pod web serverom.

Može li neko da pretpostavi šta nisam dobro podesio?

[ Burgos @ 11.08.2019. 17:58 ] @
Kada generišeš fajlove i direktorijume, postavi umask u PHP skripti na 003

Code:

$prev = umask(003);
// generisi fajlove
// ...
// povrati prethodno stanje 
umask($prev)
[ Predrag Supurovic @ 11.08.2019. 23:30 ] @
To sam našao ali ne preporučuju da se to radi u multithread okruženju a ovo na web je baš tako.

Rešio sam privilegije sa chmod() nakon kreiranja svake datotekei direktorijuma.

mkdir() neopdesava dobro privilegije kada radi rekuryivno. Morao sam da naprvim svoju funkciju koja rekurzivno kreria direktorijume na yadatoj putanji i podesava svakom direktorijumu privilegije. To jest, prilagodio sam funkciju koju sam nasao na netu.

Code:


function CreatePath($path, $Permissions=0644) {

    if (is_dir($path)) return true;

    $prev_path = substr($path, 0, strrpos($path, '/', -2) + 1 );

    $return = CreatePath($prev_path, $Permissions);

    $mResult = ($return && is_writable($prev_path)) ? mkdir($path, $Permissions) : false;

    if ($mResult) {
      chmod(dirname($path), $Permissions);
    }
    
    return $mResult;
}