изменить разрешение каталога (chmod) в php

#php #linux #apache #chmod

#php #linux #apache #chmod

Вопрос:

Я погуглил, но, похоже, не могу заставить мой скрипт работать.

это мой код

 if (is_dir("tmp")) {
    if (substr(sprintf("%o", fileperms("tmp")), -4) == "0777") {
        echo "good";
    } else {
        echo "going to chmod the tmp folder to 777";
        if (!chmod("tmp", octdec(0777))) { // tried chmod("tmp, 0777) too
                echo "Oops, I couldn't chmod the /setup/tmp directory, please do this manually";
        }
    }
} else {
    echo "we'll make the folder";
}
  

Кажется, я не могу заставить chmod работать, я где-то читал, что если register globals был отключен, то это не сработало бы (у меня этот параметр установлен в off).

Я следил за PHP.net руководство и некоторые из примеров, которые они предоставили там в комментариях пользователей, а также некоторые сообщения о переполнении стека, которые я нашел актуальными. но, возможно, мне нужно настроить некоторые настройки php, чтобы это заработало?

Есть ли способ заставить функцию chmod работать без необходимости изменять PHP.ini?

Комментарии:

1. Является ли пользователь php владельцем каталога tmp или даже группы этой папки? В противном случае он не сможет изменить chmod папки.

2. его владелец и часть группы

3. хм, это компьютер с Windows?

4. @Sn0opy: Он упоминает LAMP в комментарии к моему ответу.

Ответ №1:

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

Владелец процесса веб-сервера должен владеть каталогом или быть членом группы владельцев. Например, если root является владельцем tmp, а ваш веб-сервер запущен от имени пользователя ‘apache’, изменить разрешения каталога с помощью PHP будет невозможно.

Я полагаю, что настройки, которые вы упоминаете в php.ini, предназначены для отладки, а не для волшебного «исправления» chmod . Попробуйте добавить следующие строки кода в свой PHP-скрипт, и вы должны получить более полезный отладочный результат:

 ini_set('display_errors', 'On');
error_reporting(E_ALL)
  

Комментарии:

1. ах, это говорит о том, что операция не разрешена для chmod. Вероятно, мне нужно будет посмотреть, выполняются ли скрипты с пользователем-владельцем и разрешениями. Я думал, что они где, так как я сам настраивал сервер LAMP. Есть предложения? У меня действительно есть apache, работающий от имени того же владельца, что и пользователь, с которым я вошел в систему.

2. Если у вас нет разрешений на использование chmod для tmp , но у вас есть root-доступ к терминалу на сервере, то вы можете использовать ps aux | grep http для просмотра деталей процесса Apache и поиска пользователя. Как только вы узнаете пользователя, под которым работает Apache, вы можете стать владельцем каталога tmp с sudo chown -R webProcessUser /path/to/tmp помощью. Если вы не хотите менять владельца каталога, и вы знаете, что пользователь, работающий под управлением Apache, принадлежит к какой-либо группе, вы можете вместо этого изменить владельца группы: sudo chown -R currentOwner:newGroup /path/to/tmp

Ответ №2:

Представлять следующим образом:-

 chmod("tmp", 0777);
  

Комментарии:

1. я тоже пробовал это, моя текущая версия, которую я опубликовал, была взята из примера из php.net комментарии пользователя chmod

Ответ №3:

Пользователь, который запускает демон php или демон веб-сервера, должен иметь доступ на запись к каталогу, который вы пытаетесь изменить с помощью chmod. В моем случае www-data — это пользователь, который запускает php, и любые команды, которые php пытается выполнить, он будет запускаться как пользователь www-data.

Если вы создадите каталог с помощью функции php mkdir, вы заметите, что владельцем каталога является тот, кто когда-либо запускал php или демон веб-сервера. И любой каталог, созданный php, php сможет изменять chmod, chown, делать с ним что угодно, потому что он является владельцем.

Вы можете либо

  1. измените каталог так, чтобы владельцем был пользователь php
  2. установите права на запись для группы и присвоите группе ту же группу, что и пользователь php
  3. сделайте что-то вроде предоставления привилегий sudo пользователю php, что, кстати, не рекомендуется.