lchown()
PHP lchown() cambia il proprietario di un collegamento simbolico senza seguirlo al target. Sintassi, valore restituito e regole sui permessi.
La funzione PHP lchown() cambia il proprietario del collegamento simbolico stesso, senza seguire il link verso il suo target. Questa pagina spiega cosa fa, in cosa differisce da chown(), la firma esatta e il valore restituito, quando effettivamente ne hai bisogno e le regole sui permessi che determinano il suo successo o fallimento.
Cos'è la funzione lchown()?
lchown() è una funzione PHP integrata che imposta l'utente (proprietario) di un collegamento simbolico. Il prefisso "l" indica che opera sul link, non sul file a cui il link punta — la stessa convenzione usata dalle chiamate della libreria C sottostante (lchown vs chown).
Questa distinzione conta solo per i collegamenti simbolici. Un symlink è un piccolo file che memorizza il percorso di un altro file. La maggior parte delle chiamate al filesystem dereferenzia automaticamente un symlink: se chiami chown() su un symlink, cambi il proprietario del file target. lchown() è la variante che si ferma al link e cambia invece la proprietà del link stesso.
lchown() è la controparte per la proprietà utente di lchgrp(), che cambia il gruppo di un symlink.
Sintassi
lchown(string $filename, string|int $user): bool| Parametro | Descrizione |
|---|---|
$filename | Percorso del collegamento simbolico di cui si vuole cambiare il proprietario. |
$user | Il nuovo proprietario — un nome utente (string) come 'www-data' oppure un ID utente numerico (int) come 33. |
Valore restituito. lchown() restituisce true in caso di successo e false in caso di fallimento (ed emette un avviso, ad esempio quando mancano i permessi o il percorso non esiste).
Esempio di base
<?php
$link = '/path/to/link';
$user = 'myuser';
if (lchown($link, $user)) {
echo 'Ownership of symbolic link updated successfully';
} else {
echo 'Failed to update ownership of symbolic link';
}Qui il proprietario del collegamento simbolico /path/to/link viene impostato su myuser. Il controllo if verifica il risultato booleano in modo da poter reagire al fallimento invece di ignorarlo silenziosamente.
lchown() vs chown(): perché è importante
La differenza è più evidente quando un link e il suo target hanno proprietari diversi. Supponiamo che report.txt sia un file reale e che latest sia un symlink che vi punta:
<?php
$target = '/var/data/report.txt';
$link = '/var/data/latest'; // symlink -> report.txt
// Changes the OWNER OF report.txt (chown follows the link):
chown($link, 'alice');
// Changes the OWNER OF the symlink "latest" only; report.txt is untouched:
lchown($link, 'bob');Usa lchown() ogni volta che vuoi specificamente modificare i metadati del link senza toccare — o accidentalmente riassegnare — il file a cui punta. Usare chown() in questo caso sarebbe un errore se l'intento era riassegnare il link stesso.
Dimostrazione dall'inizio alla fine
Questo script crea un file reale e un symlink che vi punta, poi cambia il proprietario del link all'utente corrente e conferma il risultato. Poiché cambiare la proprietà richiede normalmente privilegi elevati, riassegnare al proprio utente corrente è l'unico caso consentito a un utente normale.
<?php
$target = sys_get_temp_dir() . '/lchown_target.txt';
$link = sys_get_temp_dir() . '/lchown_link';
file_put_contents($target, "hello\n");
@unlink($link); // remove any leftover link from a previous run
symlink($target, $link); // create the symbolic link
$me = posix_getpwuid(posix_geteuid())['name']; // current process user
if (lchown($link, $me)) {
echo "Link owner set to: " . posix_getpwuid(lstat($link)['uid'])['name'] . "\n";
} else {
echo "lchown() failed\n";
}lstat() (invece di stat()) viene usato per leggere i metadati del link stesso, specchiando il modo in cui lchown() li scrive.
Permessi e avvertenze
- Privilegi richiesti. Cambiare il proprietario di un elemento verso un altro utente richiede generalmente i privilegi di root. Come utente non-root di solito puoi solo "cambiare" il proprietario a te stesso, il che è effettivamente un'operazione nulla. In caso contrario aspettati
falsecon un avviso. - Windows.
lchown()è un'operazione in stile POSIX e non è disponibile su Windows. È pensata per i filesystem Unix-like. - Il percorso deve essere un symlink. Puntare
lchown()a un file normale funziona ancora tramite il sistema operativo, ma l'intero scopo della funzione sono i symlink — usachown()per i file ordinari. - Sopprimi, non ignorare. I fallimenti generano un
E_WARNING. È preferibile controllare il valore restituito (come sopra) piuttosto che silenziare l'avviso con@e sperare per il meglio.
Funzioni correlate
chown()— cambia il proprietario di un file (segue i symlink).lchgrp()— cambia il gruppo di un collegamento simbolico.chgrp()— cambia il gruppo di un file.fileowner()— legge l'ID utente del proprietario di un file.symlink()— crea un collegamento simbolico.readlink()— restituisce il target a cui punta un symlink.
Conclusione
lchown() cambia il proprietario del collegamento simbolico stesso piuttosto che del file a cui punta — il motivo principale per preferirla a chown(). Ricorda che richiede i privilegi appropriati, funziona solo su Unix e restituisce un booleano che dovresti sempre verificare.