В Ubuntu 16.04 у меня есть несколько каталогов веб-сайтов в разделе /var/www/html/
.
Я хочу, чтобы владелец каждого dir был идентичен имени dir.
Как я могу рекурсивно изменить владельца каталога по имени этого директора?
1) Я уже создал пользователя для каждого каталога как в:
useradd ${domain} --gecos --disabled-password --disabled-login
2) Цель этой операции - из соображений безопасности - запретить всем директорам иметь одного и того же владельца.
Предполагая, что www-данные - правильная группа для вашего веб-сервера
Введите следующее с вашим любимым редактором в chown_www.sh
#!/bin/bash
for directory in `find /var/www/html/ -mindepth 1 -maxdepth 1 -type d`
do
user=$(basename $directory)
chown -R $user:www-data $directory
done
сделать его исполняемым
chmod +x /path/to/script/chown_www.sh
и выполнить от имени пользователя root или через sudo
sudo /path/to/script/chown_www.sh
Отказ от ответственности: в нем нет проверки ошибок, чтобы увидеть, является ли каталог имена являются жизнеспособными пользователями (и / или чистыми именами).
find
с минимальной / максимальной глубиной 1 будет находить только те каталоги, которые находятся непосредственно под /var/www/html
- это то, что вам нужно.
-type d
, если в /html
есть какие-то файлы.
Затем мы получаем имя каталога с помощью basename
и делаем рекурсив chown
, как вы хотели.
Отказ от ответственности: Это вдохновлено пользователем muclux, но мое редактирование было отклонено
Я не знаю, хороший ли у вас план, но следующий скрипт может выполнить эту работу (вызывается с помощью sudo). Обратите внимание, что в качестве владельцев вы можете использовать только существующие идентификаторы пользователей.
#!/bin/bash
cd /var/www
for file in `find html/*`
do
d=`dirname $file`
p=`basename $d`
chown $p:www-data $file
done
Сценарий обрабатывает файлы и подкаталоги одинаково, поэтому нет необходимости в рекурсии.
basename (dirname (file)) дает вам имя непосредственного «родительского» каталога.
Я предполагаю, что у вас есть N каталогов ниже /var/www/html
и вы хотите изменить владельца только этих каталогов верхнего уровня (рекурсивно), т.е.
/var/www/html/domain1 # -> change owner to "domain1" for this dir and below
/var/www/html/domain2 # -> change owner to "domain2" for this dir and below
/var/www/html/domain3 # -> change owner to "domain3" for this dir and below
Если, например, /var/www/html/domain1
имеет подкаталоги (например, public
, css
, data
), тогда они должны принадлежать не пользователю public
и т. Д., А также пользователю domain1
.
Учитывая это предварительное условие, будет работать следующий скриптлет (как пользователь root
):
#!/usr/bin/env bash
cd /var/www/html
GLOBIGNORE=. # to catch hidden directories
for dir in *; do
test -d $dir && chown -R $dir $dir;
done
Как насчет find
?
find /var/www/html -mindepth 1 -maxdepth 1 -type d -exec bash -c 'echo chown -R "${0##*/}" "$0"' {} \;
Это просто найдет все d
irectories под /var/www/html/
и не далее ниже и exec
ют chown -R
на каждых из них. В оболочке удара $0
путь в настоящее время обрабатываемого каталога и ${0##*/}
сокращение имя каталога. Я добавил echo
выше того так, чтобы это распечатает каждый chown
команда, которую это собирается выполнить сначала, если Вы довольны результатами просто, выполняет его без echo
.
Если по какой-либо причине Вы хотите или нуждаетесь в другом подходе для задачи, вот некоторые альтернативы (все с echo
для тестирования!), parallel
один являющийся самым эффективным в случае огромного количества каталогов:
for i in /var/www/html/*/; do a=${i%/}; echo chown -R "${a##*/}" "$i"; done
for i in /var/www/html/*/; do echo chown -R "$(dirname $i)" "$i"; done
parallel echo chown -R '{=s/\/$//;s/.*\///=}' {} ::: /var/www/html/*/