Chgrp: примеры (PHP)
chgrp(string $filename, string|int $group): boolФункция chgrp изменяет группу-владельца указанного файла или директории в операционных системах на базе Unix/Linux. Она используется для управления правами доступа в файловой системе, когда необходимо предоставить доступ к файлу другой группе пользователей.
Функция имеет следующую сигнатуру:
bool chgrp(string $filename, string|int $group)
- filename (строка, обязательный): Путь к файлу или директории.
- group (строка или целое число, обязательный): Имя группы или её числовой идентификатор (GID).
Функция возвращает true в случае успеха и false в случае возникновения ошибки.
<?php
$file = 'test.txt';
if (chgrp($file, 'www-data')) {
echo "Группа файла изменена на www-data.";
} else {
echo "Не удалось изменить группу.";
}
?>
Группа файла изменена на www-data. // при успехе
<?php
$file = 'test.txt';
// Предположим, GID группы www-data равен 33
if (chgrp($file, 33)) {
echo "Группа файла изменена по GID 33.";
}
?>
Группа файла изменена по GID 33.
<?php
$file = 'несуществующий_файл.txt';
if (@chgrp($file, 'www-data')) {
echo "Группа изменена.";
} else {
echo "Ошибка изменения группы.";
}
?>
Ошибка изменения группы.
- chown(): Изменяет владельца файла. Применяется, когда нужно сменить пользователя-владельца, а не группу.
- chmod(): Изменяет права доступа к файлу. Используется для настройки разрешений чтения, записи и выполнения.
- lchgrp(): Меняет группу для символьной ссылки, а не для целевого файла. Актуально для работы с ссылками.
Функции chmod, chown и chgrp часто применяются вместе для комплексного управления доступом.
Chgrp в Python
Используется модуль os с функциями chown() (может менять и группу) или lchown().
import os
import pwd
gr = pwd.getpwnam('www-data').pw_gid
os.chown('test.txt', -1, gr) # -1 оставляет владельца без изменений
print("Группа изменена")
Применяется метод chown из модуля fs.
const fs = require('fs');
fs.chown('test.txt', null, 33, (err) => { // null оставляет владельца
if (err) throw err;
console.log('Группа изменена');
});
Chgrp в MySQL
Прямого аналога нет, так как СУБД работает с данными, а не с файлами файловой системы. Однако есть команда chown в shell.
# Команда в shell
chgrp www-data test.txt<?php
$file = '/etc/passwd';
$result = @chgrp($file, 'www-data');
var_dump($result); // bool(false)
?>
bool(false)
<?php
$file = 'test.txt';
$result = @chgrp($file, 'неизвестная_группа');
var_dump($result); // bool(false)
?>
bool(false)
<?php
$file = 'missing.txt';
$result = @chgrp($file, 'www-data');
var_dump($result);
?>
bool(false)
Для отлова ошибок можно использовать оператор контроля ошибок @ или проверять существование файла и группы перед вызовом функции.
В PHP 8.0.0 параметр group стал принимать как строку, так и целое число. Ранее допускался только строковый тип. Это изменение упрощает использование числового GID.
<?php
// Работает в PHP 8+
chgrp('file.txt', 1001); // GID как integer
chgrp('file.txt', 'users'); // Имя группы как string
?><?php
function chgrpRecursive($dir, $group) {
$items = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($items as $item) {
if ($item->isLink()) {
continue; // Пропускаем символьные ссылки
}
if (@chgrp($item->getPathname(), $group)) {
echo "Группа для: " . $item->getPathname() . " изменена.<br>";
}
}
}
chgrpRecursive('./project', 'www-data');
?>
<?php
function getGroupId($groupName) {
$groupInfo = posix_getgrnam($groupName);
return $groupInfo ? $groupInfo['gid'] : false;
}
$file = 'data.log';
$groupName = 'www-data';
$gid = getGroupId($groupName);
if ($gid !== false) {
chgrp($file, $gid); // Используем числовой GID
echo "Группа установлена.";
} else {
echo "Группа $groupName не найдена.";
}
?>
<?php
$target = 'original.txt';
$link = 'link_to_original.txt';
symlink($target, $link);
// chgrp() изменит группу целевого файла, а не ссылки
chgrp($link, 'www-data');
echo "Группа изменена для целевого файла.";
// Для изменения группы самой ссылки нужна lchgrp()
if (function_exists('lchgrp')) {
lchgrp($link, 'staff');
}
?>
<?php
$files = ['a.txt', 'b.txt', 'c.txt'];
$results = [];
foreach ($files as $file) {
if (file_exists($file)) {
$results[$file] = chgrp($file, 'www-data');
}
}
print_r($results);
?>
Array
(
[a.txt] => 1
[b.txt] => 1
[c.txt] => 1
)