Lchown: примеры (PHP)
lchown(string $filename, string|int $user): boolФункция lchown в PHP используется для изменения владельца символической ссылки. В отличие от функции chown, она воздействует на саму ссылку, а не на целевой файл или каталог. Это важно при работе в системах, где требуется управление правами доступа на уровне символических ссылок.
- $filename (string) - Путь к символической ссылке.
- $user (string|int) - Имя пользователя (строка) или его числовой идентификатор UID (целое число), который будет назначен новым владельцем ссылки.
Функция возвращает true в случае успешного выполнения и false при возникновении ошибки. Для работы функции требуются соответствующие права в операционной системе, обычно права суперпользователя.
<?
$link = 'symlink_to_file';
$user = 'www-data';
if (lchown($link, $user)) {
echo 'Владелец ссылки изменен.';
} else {
echo 'Ошибка изменения владельца.';
}
?>Владелец ссылки изменен.
<?
$link = 'symlink_to_config';
$uid = 1001;
$result = lchown($link, $uid);
var_dump($result);
?>bool(true)
- chown - Изменяет владельца обычного файла или каталога, а также целевого объекта символической ссылки. Следует использовать, когда необходимо изменить владельца самого файла, а не ссылки на него.
- chgrp - Изменяет группу файла или символической ссылки. Может применяться вместе с
lchownдля полного управления правами доступа. - lchgrp - Изменяет группу символической ссылки. Аналог
lchownдля управления группой.
Выбор функции зависит от задачи: для работы с символическими ссылками используют lchown и lchgrp, для работы с обычными файлами - chown и chgrp.
<?
$link = '/etc/symlink';
$user = 'www-data';
if (!lchown($link, $user)) {
echo 'Ошибка: недостаточно прав.';
}
?>Ошибка: недостаточно прав.
<?
$result = @lchown('non_existent_link', 'www-data');
if ($result === false) {
echo 'Символическая ссылка отсутствует.';
}
?>Символическая ссылка отсутствует.
<?
lchown('link', []);
?>Warning: lchown() expects parameter 2 to be string|int, array given
В PHP 8.0.0 функция lchown была перенесена из стандартного расширения в расширение POSIX. Для ее использования требуется установка модуля posix. В более ранних версиях функция была доступна в основном расширении файловой системы.
Начиная с PHP 8, параметр $user может быть как строкой, так и целым числом, что соответствует объявлению типа string|int. В версиях до PHP 8 тип аргумента не был строго определен.
<?
function changeLinkOwner(string $link, $user): void {
if (!is_link($link)) {
throw new Exception('Указанный путь не является символической ссылкой.');
}
if (!lchown($link, $user)) {
throw new Exception('Не удалось изменить владельца ссылки.');
}
}
try {
changeLinkOwner('symlink', 33);
echo 'Владелец успешно изменен.';
} catch (Exception $e) {
echo 'Ошибка: ' . $e->getMessage();
}
?>Владелец успешно изменен.
<?
$directory = '/path/to/links';
$user = 'www-data';
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file) {
if ($file->isLink()) {
if (lchown($file->getPathname(), $user)) {
echo 'Обработана ссылка: ' . $file->getFilename() . PHP_EOL;
}
}
}
?>Обработана ссылка: config_link Обработана ссылка: data_link
<?
$link = 'symlink';
$linkInfo = lstat($link);
$currentUid = $linkInfo['uid'];
$newUid = 1001;
if ($currentUid !== $newUid) {
lchown($link, $newUid);
echo 'Владелец обновлен.';
} else {
echo 'Владелец уже соответствует.';
}
?>Владелец обновлен.
Lchown в Python
Функция os.lchown() принимает путь, UID и GID.
import os
os.lchown('symlink', 1001, 1001)
print('Владелец изменен.')Владелец изменен.
Используется fs.lchown() в асинхронном или синхронном варианте.
const fs = require('fs');
fs.lchownSync('symlink', 1001, 1001);
console.log('Владелец изменен.');Владелец изменен.
chown -h www-data symlinkКлюч -h указывает на изменение владельца самой ссылки.