Newsgroup: it.comp.www.php
Titolo: togliere e rimettere il permesso di scrittura di una directory

tramite il sistema operativo (ubuntu) si apre il terminale e si digita:
 
   chmod -w /tmp/abc
 
oppure (per ripristinare l'attributo)
 
   chmod +w /tmp/abc
 
In php si può fare?


Certo.
 
http://php.net/manual/en/function.chmod.php
 
 
per come impostare "il numerello" leggiti:
 
http://en.wikipedia.org/wiki/File_system_permissions#Numeric_notation
 
 
Se fai qualche esperimento leggiti bene anche le "notes" sul primo link, perché
quando si ha a che fare con i permessi ci sono sempre un sacco di restrizioni
dovute alle policy di sicurezza.
 
Ciao!

fma...@gmail.com
 ha scritto:

Allora, io pero' voglio intervenire solo sul flag *w* lasciando
 inalterati gli altri attributi
-- 
 
 
----Android NewsGroup Reader----
http://usenet.sinaapp.com/
 


fai prima un fileperms() e prendi gli attributi correnti, poi fai una maschera
binaria per ottenere i nuovi permessi (per esempio, se devi attivare il write
dell'utente "& 0x2", se devi levare la lettura del gruppo &~0x4, etc.) e infine
il chmod().
 
Ciao!

 il chmod().
 
$old_defined_vars = get_defined_vars();
 
// attributi originali
$orig = array(
     'w_si' => fileperms(__DIR__.'/w_si'), // directory con permesso di 
scrittura
     'w_no' => fileperms(__DIR__.'/w_no'), // directory senza permesso 
di scrittura
);
 
$wAttribCode = 200;
 
// attivazione scrittura
$enable = array(
     'w_si' => $orig['w_si'] &~$wAttribCode,
     'w_no' => $orig['w_no'] &~$wAttribCode,
);
 
// disattivazione scrittura: viene rimessa la protezione ad entrambe le 
directory, anche a chi in precedenza non c'è l'aveva (w_si)
$disable = array(
     'w_si' => $enable['w_si'] & $wAttribCode,
     'w_no' => $enable['w_no'] & $wAttribCode,
);
 
$_count = count(get_defined_vars()) - count($old_defined_vars);
print_r(array_slice(get_defined_vars(), -$_count, $_count));
 
e ottengo
 
     [orig] => Array
         (
             [w_si] => 16895
             [w_no] => 16767
         )
 
     [wAttribCode] => 200
     [enable] => Array
         (
             [w_si] => 16695
             [w_no] => 16695
         )
 
     [disable] => Array
         (
             [w_si] => 0
             [w_no] => 0
         )
 
Come vedi seconda directory (w_no) passa da 16767 a 16695.
Mentre la prima directory (w_si) aveva già la scrittura abilitata, 
quindi gli rimane il codice 16695.
Tutto ok!!!
 
Il problema è quando si deve rimettere la protezione dalla scrittura 
(disable).
Gli attributi vengono addirittura azzerati per entrambe le directory; 
invece entrambe dovrebbero avere il codice 16767.

 invece entrambe dovrebbero avere il codice 16767.
 
Come sopra.
 
Ciao!

 il chmod().
 
ottenere, cioè leggere?
forse volevi dire impostare?

>           )
 
allora, sicuramente faccio confusione tra decimale-esadecimale.
Cmq ho fatto queste modifiche
 
$old_defined_vars = get_defined_vars();
 
// attributi originali
$orig = array(
     'w_si' => dechex(fileperms(__DIR__.'/w_si')), // directory con 
permesso di scrittura
     'w_no' => dechex(fileperms(__DIR__.'/w_no')), // directory senza 
permesso di scrittura
);
 
$wAttribCode = 0x200;
 
// attivazione scrittura
$enable = array(
     'w_si' => $orig['w_si'] | $wAttribCode,
     'w_no' => $orig['w_no'] | $wAttribCode,
);
 
// eseguo alcune operazioni..........
 
// disattivazione scrittura (viene rimessa la protezione)
$disable = array(
     'w_si' => $enable['w_si'] &~$wAttribCode,
     'w_no' => $enable['w_no'] &~$wAttribCode,
);
 
$_count = count(get_defined_vars()) - count($old_defined_vars);
print_r(array_slice(get_defined_vars(), -$_count, $_count));
 
 
 
da cui ottengo
 
 
Array
(
     [orig] => Array
         (
             [w_si] => 41ff
             [w_no] => 417f
         )
 
     [wAttribCode] => 512
     [enable] => Array
         (
             [w_si] => 553
             [w_no] => 929
         )
 
     [disable] => Array
         (
             [w_si] => 41
             [w_no] => 417
         )
 
     [_count] => 5
)
 
invece quello che vorrei ottenere è
 
Array
(
     [orig] => Array
         (
             [w_si] => 41ff
             [w_no] => 417f
         )
 
     [wAttribCode] => 512
     [enable] => Array
         (
             [w_si] => 41ff
             [w_no] => 41ff
         )
 
     [disable] => Array
         (
             [w_si] => 417f
             [w_no] => 417f
         )
 
     [_count] => 5
)
 
In pratica voglio:
- dare la scrivibilità a tutte le directory
- eseguire alcune operazioni (non interessa quali)
- togliere la scrivibilità a tutte le directory
 

 - togliere la scrivibilità a tutte le directory
 
Te lo scrivo, va - faccio prima così che a dirti un'altra volta di leggerti
quello che t'avevo passato :/
 
per il debug faccio una funzioncina:
function debugEchoFilePerm($file) {
    /* pulisco la statcache, altrimenti il risultato è sempre lo stesso */
    clearstatcache();
    /* stampo l'esadecimale dei permessi pulendo i bits alti che non
       c'interessano */
    echo dechex(fileperms($file)&~0xf000)."\n";
}
 
 
$file = 'myfile.txt';
/* disattivo la maschera di base */
$old = umask(0);
debugEchoFilePerm($file);
 
/* user/group-write bit on */
chmod($file, (fileperms($file)&~0xf000)|0x90);
debugEchoFilePerm($file)
 
/* ... */
 
/* user/group-write bit off */
chmod($file, (fileperms($file)&~0xf000)&~0x90);
debugEchoFilePerm($file)
 
/* reimposto la maschera di base */
umask($old);
 
 
Ciao!


ok, adesso è chiaro.
Però in una delle successive versioni di php, una bella funzione simil-bash:
 
set_file_write_attrib($file, $bool);
 
tanto per evitare di diventare cretini con la matematica binaria, non 
per altro

 per altro
 
Non per fare il puntiglioso, eh, ma la matematica binaria è la prima cosa che
si studia in informatica.
 
Anche se ci fossero funzioni simili farebbero comunque tutti solo maschere.
 
Ciao!

 si studia in informatica.
 
Seguita a ruota dalla ginnastica dei puntatori :)
 
-- 
g4b0, linux user n. 369000
http://brosulo.net
 

 Anche se ci fossero funzioni simili farebbero comunque tutti solo maschere.
 
come sopra
 

 
 
No beh, è che, certe cose son sempre più veloci da fare in una certa maniera,
e non si possono semplificare più di così!
Se un comando in un linguaggio d'alto livello sono centomila istruzioni
macchina uso quello, ma se voglio fare un "NOP" e il linguaggio in questione
ha l'istruzione "NOP", uso quella, non un helper! :)
 
Ciao!

 ha l'istruzione "NOP", uso quella, non un helper!:)
 
scrittura un po' confusa, ma il concetto credo di averlo capito, più o 
meno :)

 
 
Domanda OT, ma visto che son curioso e che qui ci scriviamo spesso mi permetto,
è sempre interessante capire con chi si parla, e soprattutto come rispondere!
Non sono famoso per dare risposte buoniste, sono svariato acido, lo devo
ammettere! :)
 
Quanti anni hai, e qual'è il tuo background informatico?
Lo chiedo, come ho detto, solo perché non voglio essere scortese: se hai
16 anni, fai il professionale e non sai fare una maschera di bit ti mando
a quel paese e ti dico di studiare, se ne hai 90, ti hanno regalato un 
computer lo scorso natale e già provi a scrivere in PHP hai solo la mia stima
incondizionata. Sicuramente sei una via di mezzo, e mi piacerebbe conoscerla ;)
 
Per par condicio, inizio a dirti di me, sennò pare che mi voglio fare i fatti
tuoi... non che sia difficile trovare il mio CV online cercando il mio nome
o la mia email, ma tant'è :D
Io non sono vecchissimo (classe '81), programmo dal mio primo Amiga500 (nell'
88/89, credo - l'assembly del motorola era una figata :)) ed è il mio lavoro
da, boh, ancora facevo l'università, quindi son più di 15 anni. Non è
tantissimo ma purtroppo nel mondo web ho così tanto a che fare con l'effetto
Dunning-Kruger che mi sono inacidito abbastanza quando parlo di cose tecniche,
specialmente sugli NG dove in realtà di gente che ne ha da dire ce n'è a
palate (sempre meno, ma molti rimangono!). Avevo iniziato a seguire gli NG
per imparare, ma purtroppo ad oggi le discussioni dove vengon fuori argomenti
interessanti si contano sulla punta della dita - vabè, sto divagando.. :)
 
Ciao!

 set_file_write_attrib($file, $bool);
 
Use at your own risk:
 
http://pastebin.com/iKky8Vtu
 
 
(trovata sul manuale online di PHP con 3 commenti negativi: 
http://php.net/manual/en/function.fileperms.php
 )
 
Bye.

 da, boh, ancora facevo l'università, quindi son più di 15 anni. Non è
 
io invece a 13-14 anni ho frequentato un corso privato (quasi per 
divertimento), quindi son partito da gw-basic, e poi da autodidatta: 
visual-basic, c, e infine java e php.
Realizzo più che altro progetti in privato, per conoscenti o per me stesso.
Insomma niente roba ultra-professionale
 

 debugEchoFilePerm($file)
 
Scusate se mi intrometto, ma 0x90 (144) perchè?
Se ad esempio si volesse intervenire sul flag *r*?


Mi stavo chiedendo anche io perché usi l'esadecimale, ma ho presunto che 
fosse qualcosa che non so io.
 
Io uso normalmente l'ottale: 0ugo, dove u è user, g è group e o è other, 
con 1=execute, 2=write e 4=read. Basta sommare, quindi se vuoi rwxr-x--- 
diventa 0750. Se vuoi aggiungere il read a tutti i livelli basta mettere 
in or con 0444;
 
Bye.


0x80+0x10 (bits 8 e 5 (contando da 1)- il write di u e g)
per i read vuoi i bit 9 e 6, quindi 0x100+0x20 = 0x120
 
Di solito molti preferiscono l'ottale, perché boh, ricordano il mnemonico,
che viene fuori raggruppando i bits tre a tre: 010/010/000 = 0220 per i due
write o 100/100/000 = 0440 per i due read.
 
Io sinceramente se già devo fare maschere (in questo caso buttare i bit alti
perché tipo su linux fileperm ritorna anche il tipo di file) e mischio hex
e oct mi si frigge il cervello :)
 
Poi boh, sarà che ho usato in vita mia così tanto l'hex e così poi l'oct che
lo visualizzo meglio.. se so quali bit vanno accesi e quali spenti mi viene
più naturale - YMMV.
 
Ciao!


Sì, come ho risposto già a digimon forse per i permessi dei file è più
comune l'ottale, ma mischiarlo con esadecimale nella stessa riga m'inquieta
un po', e personalmente l'esadecimale lo leggo al volo mentre l'ottale ci
devo pensare - alla fine, oltre che per i permessi, ormai dove altro si usa?
 
Ciao!