Chmod: примеры (PHP)
chmod(string $filename, int $permissions): boolФункция chmod изменяет права доступа к указанному файлу или директории в операционных системах Unix/Linux и их аналогах. Она используется для управления разрешениями на чтение, запись и выполнение для владельца, группы и всех остальных пользователей.
Функция имеет два обязательных параметра:
- filename (string) - путь к файлу или директории
- permissions (int) - числовое представление прав доступа (восьмеричное число)
Возвращает true при успешном выполнении и false при ошибке.
Права задаются восьмеричным числом, состоящим из трех или четырех цифр:
- Первая цифра (опционально) - специальные флаги (setuid, setgid, sticky bit)
- Вторая цифра - права владельца (owner)
- Третья цифра - права группы (group)
- Четвертая цифра - права для остальных (others)
- 4 - чтение (read)
- 2 - запись (write)
- 1 - выполнение (execute)
// Права 644: владелец - чтение/запись, группа - чтение, остальные - чтение
$result = chmod('/path/to/file.txt', 0644);
echo $result ? 'Успешно' : 'Ошибка';
Успешно
// Права 755: владелец - все, группа - чтение/выполнение, остальные - чтение/выполнение
chmod('/path/to/script.php', 0755);
true
// Конвертация строки в восьмеричное число
$permissions = intval('755', 8);
$result = chmod('/path/to/file.php', $permissions);
var_dump($result);
bool(true)
// Установка прав для директории
chmod('/path/to/directory', 0755);
// Рекурсивное изменение прав через итератор
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/path/to/dir'),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $item) {
if ($item->isFile()) {
chmod($item->getPathname(), 0644);
} else {
chmod($item->getPathname(), 0755);
}
}Устанавливает маску прав по умолчанию для вновь создаваемых файлов и директорий. Работает глобально для текущего процесса.
// Установка маски 022
$old = umask(022);
// Создание файла с учетом маски
fopen('newfile.txt', 'w');
// Восстановление предыдущей маски
umask($old);
Возвращает информацию о правах доступа к файлу в виде целого числа.
$perms = fileperms('/path/to/file.txt');
echo decoct($perms & 0777);
644
Проверяют конкретные права доступа для текущего пользователя PHP.
$file = '/path/to/file.txt';
if (is_readable($file)) {
echo 'Файл доступен для чтения';
}
if (is_writable($file)) {
echo 'Файл доступен для записи';
}Chmod в Python
Использует функцию os.chmod() с аналогичной логикой, но поддерживает symbolic notation.
import os
import stat
# Числовой формат
os.chmod('/path/to/file.txt', 0o644)
# Символьный формат
os.chmod('/path/to/file.txt', stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH)
Функция fs.chmod() с асинхронным и синхронным вариантами.
const fs = require('fs');
// Асинхронный вызов
fs.chmod('/path/to/file.txt', 0o755, (err) => {
if (err) throw err;
console.log('Права изменены');
});
// Синхронный вызов
fs.chmodSync('/path/to/file.txt', 0o644);
Команда chmod с поддержкой символьной и числовой записи.
# Числовая запись
chmod 755 script.sh
# Символьная запись
chmod u+rwx,g+rx,o+rx script.sh
Chmod в MySQL
СУБД MySQL не имеет прямой аналогии, но имеет систему привилегий для объектов базы данных.
GRANT SELECT, INSERT ON database.* TO 'user'@'localhost';
FLUSH PRIVILEGES;// Неправильно - десятичное число 755 вместо восьмеричного 0755
chmod('/path/to/file.txt', 755);
Права установятся как 755 в десятичной системе, что соответствует 1363 в восьмеричной
// Требуются права суперпользователя
$result = chmod('/etc/passwd', 0666);
var_dump($result);
bool(false)
$result = chmod('/nonexistent/file.txt', 0644);
if ($result === false) {
echo 'Файл не найден или нет прав доступа';
}
Файл не найден или нет прав доступа
// На Windows функция имеет ограниченную функциональность
chmod('C:\\file.txt', 0644);
// Изменяются только атрибуты "только для чтения" и "скрытый"В PHP 8.0 не было внесено значительных изменений в работу функции chmod. Основное поведение осталось стабильным на протяжении многих версий.
- Улучшена обработка ошибок
- Более строгая типизация параметров
- Поддержка 64-битных систем для больших значений прав
Функция сохраняет обратную совместимость со всеми версиями PHP, начиная с PHP 4. Основной синтаксис и поведение не изменялись.
function safeChmod(string $file, int $permissions): bool {
if (!file_exists($file)) {
trigger_error("Файл не существует: $file", E_USER_WARNING);
return false;
}
// Проверка текущих прав
$current = fileperms($file) & 0777;
// Изменяем только если необходимо
if ($current !== $permissions) {
return chmod($file, $permissions);
}
return true;
}
// Использование
safeChmod('/path/to/file.txt', 0644);
$directory = '/path/to/project';
$filePattern = '*.php';
foreach (glob($directory . '/**/' . $filePattern, GLOB_BRACE) as $file) {
// Только для PHP файлов
if (pathinfo($file, PATHINFO_EXTENSION) === 'php') {
// Пропускаем симлинки
if (!is_link($file)) {
chmod($file, 0644);
echo "Изменены права для: $file\n";
}
}
}
function chmodSymbolic(string $file, string $symbolic): bool {
$permissions = 0;
// Парсинг символьной записи (упрощенный вариант)
if (strpos($symbolic, 'u+r') !== false) $permissions |= 0400;
if (strpos($symbolic, 'u+w') !== false) $permissions |= 0200;
if (strpos($symbolic, 'u+x') !== false) $permissions |= 0100;
if (strpos($symbolic, 'g+r') !== false) $permissions |= 0040;
if (strpos($symbolic, 'g+w') !== false) $permissions |= 0020;
if (strpos($symbolic, 'g+x') !== false) $permissions |= 0010;
if (strpos($symbolic, 'o+r') !== false) $permissions |= 0004;
if (strpos($symbolic, 'o+w') !== false) $permissions |= 0002;
if (strpos($symbolic, 'o+x') !== false) $permissions |= 0001;
return chmod($file, $permissions);
}
// Использование
chmodSymbolic('/path/to/script.sh', 'u+rwx,g+rx,o+rx');
class PermissionBackup {
private array $backup = [];
public function backup(string $file): void {
if (file_exists($file)) {
$this->backup[$file] = fileperms($file) & 0777;
}
}
public function restore(string $file): bool {
if (isset($this->backup[$file])) {
return chmod($file, $this->backup[$file]);
}
return false;
}
}
// Использование
$backup = new PermissionBackup();
$backup->backup('/path/to/file.txt');
chmod('/path/to/file.txt', 0777);
// ... операции с файлом
$backup->restore('/path/to/file.txt');
// Установка setuid бита (4000)
chmod('/path/to/executable', 04755);
// Установка setgid бита (2000) для директории
chmod('/path/to/shared_dir', 02775);
// Sticky bit (1000) для временных директорий
chmod('/tmp/shared_tmp', 01777);
// Комбинация специальных флагов
chmod('/path/to/special', 06755); // setuid + setgid
// Использование shell_exec как альтернатива
function chmodViaShell(string $file, int $permissions): string {
$octal = decoct($permissions);
return shell_exec("chmod $octal " . escapeshellarg($file));
}
// Использование
chmodViaShell('/path/to/file.txt', 0755);
// Проверка через stat
function getPermissionsVerbose(string $file): string {
$perms = fileperms($file);
$info = '';
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ? 'x' : '-');
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ? 'x' : '-');
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ? 'x' : '-');
return $info;
}
echo getPermissionsVerbose('/path/to/file.txt');
rw-r--r--