На сервере разработки (Ubuntu 14.04) у нас есть этот сценарий оболочки, который каждую минуту запускается в cron:
for dir in /home/*; do
username=$(basename $dir)
echo "changing ownership to $username in $dir/public_html"
chown -R $username:$username $dir/public_html
chmod 755 $dir
chmod -R 775 $dir/public_html
done
Которая имеет цель сменить владельца и chmod любого файла на имя пользователя виртуального хоста. Это связано с тем, что при создании нового файла он создается «пользователем root», поскольку наши локальные машины подключены к серверу по протоколу SMB с использованием пользователя root. Файлы должны принадлежать имени пользователя virtualhost, чтобы они могли работать.
Этот скрипт работает отлично, НО начнет замедлять работу сервера, когда мы получим много виртуальных хостов / файлов, поскольку он уничтожает все, независимо от того, нужно ли это ему. В большинстве случаев это не нужно, так как нужны только новые файлы.
Я думаю изменить его на каталог foreach public_html, искать любые файлы, которые не принадлежат этому имени пользователя виртуального хоста, и искать только его.
Но я боюсь, что необходимость пролистывать каждый файл, чтобы узнать, какие из них нужно chown, может быть столь же (или более) интенсивным, чем то, как он работает в данный момент (просто просматривая уровень каталогов, а затем выполняется рекурсивно).
Так было интересно, есть ли у кого-нибудь идея получше? (доволен решением сценария sh или php)
Цель: любой вновь созданный файл, chown и chmod его на имя пользователя виртуального хоста и 755. Пропустить все остальные файлы. Также было бы неплохо иметь возможность пропускать определенные типы файлов в любом случае.
"chown -R" не изменит ни один файл, у которого уже есть желаемый владелец. Вероятно, это будет работать более эффективно, чем написание программы, которая сделает это самостоятельно. chown написан очень хорошими программистами, которые, вероятно, учли множество крайних случаев, которых у вас может не быть. Однако единственный способ узнать это с помощью теста производительности. (Я бы хотел увидеть ваши результаты!)
Вот простой скрипт, который безопасно найдет файлы, не принадлежащие mary, и установит их владельцем mary:
find /home/the_place_to_start -xdev \! -user mary -print0 | xargs -0 chown mary
«-Xdev» означает «не пересекать точки монтирования» и является хорошим безопасным механизмом. Опции «-print0» и «-0» предназначены для безопасной обработки имен файлов с пробелами и новой строкой. Это (и chmod -R) не будет следовать символическим ссылкам по соображениям безопасности ... если кто-то сделал символическую ссылку на /
было бы очень плохо.
Кроме того, если вы запускаете задание cron каждую минуту, часто лучше запускать один и тот же код в цикле. Вот объяснение почему: http://everythingsysadmin.com/2014/02/how-not-to-use-cron.html
Я бы использовал что-то вроде Наблюдатель, который использует функцию inotify ядра Linux. Если вы знакомы с incron
тогда ты знаешь что Watcher
есть разница в том, что Watcher рекурсивен, тогда как incron
может смотреть только каталог, но не подкаталоги в нем.
Таким образом, вместо того, чтобы постоянно сканировать постоянно растущий каталог / home, вы можете настроить Watcher для получения сигналов от ядра, когда какой-либо файл / каталог изменяется в / home, а затем запускать любые команды или сценарии, которые вам нужны для этих файлов. Это намного быстрее и требует меньше ресурсов.
Лучшее, что можно сделать здесь, - это не разрешать всем подключаться как root, это может быть целесообразно, но, как вы обнаружили, приводит ко множеству других проблем. Это то, что я выбрал бы в качестве первого варианта (и даже если бы он изначально был отклонен, я бы продолжал использовать его в долгосрочной перспективе).
Вы можете получить некоторую прибыль от самбы force user
и force group
директивы с использованием %u
и %g
замены.
Вы можете использовать inotify, который может обнаруживать изменения файловой системы и запускать скрипт.
Мое предложение состоит в том, чтобы создать среду, в которой файлы создаются с правильным perms / владельцем / группой в первую очередь. Затем "chmod -R" / "chown -R" можно использовать для исправления ситуации, когда люди ошиблись.
"chmod ug + s" в каталоге сообщает Linux, что файлы, созданные в этом каталоге, не должны создаваться с пользователем / группой пользователя, а вместо этого наследовать пользователя / группу родительского каталога.
В последний раз, когда мне нужно было сделать что-то подобное, я создал среду, в которой действительно имели значение только разрешения группы. Поэтому "chmod g + s" в каталоге проверяет, что новые файлы принадлежат правильной группе. Затем я настроил Apache так, чтобы для доступа к файлам требовалось только разрешение этой группы.
Последнее, что мне нужно было сделать, это убедиться, что у пользователей установлен параметр «umask 002», чтобы они создавали файлы, которые по умолчанию были «доступны для группового чтения».
Иногда, несмотря на все мои усилия, кто-то создавал файл с неправильными разрешениями. У меня был сценарий оболочки, который исправил все разрешения. Однако не обязательно запускать каждую минуту ... только раз в час. На тот момент эффективность не была так важна.
Скрипт выглядел примерно так:
cd /the/place/where/the/files/are
# Fix the owner and group:
find . -xdev \! -user the_user -print0 | xargs -0 chown the_user
find . -xdev \! -group the_group -print0 | xargs -0 chgrp the_group
# Fix the perms for dirs and files:
find . -xdev -type d -print0 | xargs -0 chmod ug+rx
find . -xdev -type f -print0 | xargs -0 chmod ug+r