PHP: добавить новое разрешение в файл - PullRequest
0 голосов
/ 02 января 2019

На моем сервере у меня есть несколько файлов с разными разрешениями .

В моем сценарии php я хочу добавить запись разрешения для группы для каждого из этих файлов.

Используя linux cmd, chmod g+w file выполняет свою работу.

Но как это сделать, используя php chmod()?

Это то, что я пробовал до сих пор:

$filePermission = fileperms('myFile.txt');
# g+w = 020
chmod('myFile.txt', $filePermission+20);

Это дает мне то, что я хочу, но есть ли php альтернатива для Linux chmod g+w?

1 Ответ

0 голосов
/ 02 января 2019

Синтаксис g+w недопустим для PHP, как и для большинства языков программирования, поскольку базовая операционная система не имеет понятия об этих значениях.Системный вызов chmod принимает только восьмеричные значения, а не строки.В вашей системе в исполняемом файле командной строки chmod реализован синтаксический анализатор для реализации этой пользовательской функции.

Хотя ваш пример «работает», он приведет к нежелательным результатам, если файл уже имеет g + w, как добавление другого20 включит дополнительные биты и предоставит файлу дополнительные разрешения, которые вы не намеревались.Например, если разрешение файла было 020 и вы добавили к нему 020, оно стало бы 040.

Разрешения файла Posix - это восьмеричные биты, где каждая цифра представляет комбинацию чтения, записи ивыполнить.Так как операция добавления (+) является неправильной, вам вместо этого нужно использовать побитовые операции, такие как AND и OR, чтобы включить или выключить отдельные биты.Для PHP, C, C ++ и большинства распространенных языков оператор AND - это символ амперсанда (&), а оператор OR - это символ канала (|).Поскольку мы хотим включить биты, нам нужно использовать оператор ИЛИ.

Правильный способ справиться с этим:

$filePermission = fileperms('myFile.txt');
chmod('myFile.txt', $filePermission | 020);

Обратите внимание, что я поставил перед числом 0, это заставит PHP интерпретировать число как восьмеричное, а не как десятичное число.

Недавно я сделал видео об этом, чтобы попытаться помочь людям понять chmod и как работает восьмеричная запись, это может помочь вам счто вы пытаетесь достичь.https://www.youtube.com/watch?v=j8FLsxdl0ns

Если вы хотите иметь дружественную поддержку menomic в качестве бинарного файла командной строки, вам нужно будет реализовать синтаксический анализатор самостоятельно или вызвать двоичный файл командной строки из PHP, например:

exec('/bin/chmod ' . escapeshellarg($perms) . ' ' . escapeshellarg($file));

Обратите внимание, что это использование намного медленнее, чем использование встроенной функции chmod в PHP напрямую.Это также может открыть вас для потенциальных проблем безопасности.

...