Рекурсивно изменить владельца каталога по имени этого каталога

В Ubuntu 16.04 у меня есть несколько каталогов веб-сайтов в разделе /var/www/html/.

Я хочу, чтобы владелец каждого dir был идентичен имени dir.

Как я могу рекурсивно изменить владельца каталога по имени этого директора?

Примечания:

1) Я уже создал пользователя для каждого каталога как в:

useradd ${domain} --gecos --disabled-password --disabled-login

2) Цель этой операции - из соображений безопасности - запретить всем директорам иметь одного и того же владельца.

1
задан 18 January 2018 в 03:21

4 ответа

Рабочий скрипт

Предполагая, что 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, но мое редактирование было отклонено

4
ответ дан 18 January 2018 в 03:21

Я не знаю, хороший ли у вас план, но следующий скрипт может выполнить эту работу (вызывается с помощью 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)) дает вам имя непосредственного «родительского» каталога.

0
ответ дан 18 January 2018 в 03:21

Я предполагаю, что у вас есть 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
0
ответ дан 18 January 2018 в 03:21

Как насчет find?

find /var/www/html -mindepth 1 -maxdepth 1 -type d -exec bash -c 'echo chown -R "${0##*/}" "$0"' {} \;

Это просто найдет все directories под /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/*/
0
ответ дан 18 January 2018 в 03:21

Другие вопросы по тегам:

Похожие вопросы: