1

Lchown: примеры (PHP)

Изменение владельца символических ссылок через lchown
Раздел: Работа с файловой системой
lchown(string $filename, string|int $user): bool
Описание функции lchown

Функция 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 'Ошибка изменения владельца.';
}
?>
Владелец ссылки изменен.
Изменение владельца по UID
<?
$link = 'symlink_to_config';
$uid = 1001;
$result = lchown($link, $uid);
var_dump($result);
?>
bool(true)
Похожие функции в PHP
  • 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

В PHP 8.0.0 функция lchown была перенесена из стандартного расширения в расширение POSIX. Для ее использования требуется установка модуля posix. В более ранних версиях функция была доступна в основном расширении файловой системы.

Начиная с PHP 8, параметр $user может быть как строкой, так и целым числом, что соответствует объявлению типа string|int. В версиях до PHP 8 тип аргумента не был строго определен.

Расширенные примеры
Обработка ошибок с исключениями
Пример php
<?
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();
}
?>
Владелец успешно изменен.
Рекурсивная обработка ссылок в каталоге
Пример php
<?
$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
Проверка текущего владельца перед изменением
Пример php
<?
$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('Владелец изменен.')
Владелец изменен.
JavaScript (Node.js)

Используется fs.lchown() в асинхронном или синхронном варианте.

const fs = require('fs');
fs.lchownSync('symlink', 1001, 1001);
console.log('Владелец изменен.');
Владелец изменен.
Команда shell
chown -h www-data symlink

Ключ -h указывает на изменение владельца самой ссылки.

PHP lchown function comments

En
Lchown Changes user ownership of symlink