#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, делать с ним что угодно, потому что он является владельцем.
Вы можете либо
- измените каталог так, чтобы владельцем был пользователь php
- установите права на запись для группы и присвоите группе ту же группу, что и пользователь php
- сделайте что-то вроде предоставления привилегий sudo пользователю php, что, кстати, не рекомендуется.