Dans Ubuntu 16.04, j'ai quelques répertoires de sites Web sous /var/www/html/
.
Je désire que le propriétaire de chaque répertoire soit identique au nom du répertoire.
Comment pourrais-je changer récursivement le propriétaire d'un répertoire portant le nom de ce répertoire?
1) J'ai déjà créé un utilisateur pour chaque répertoire comme dans:
useradd ${domain} --gecos --disabled-password --disabled-login
2) Cette opération a un objectif de sécurité - éviter que tous les répertoires aient le même propriétaire.
En supposant que www-data constitue le groupe approprié pour votre serveur Web
Entrez ce qui suit avec votre éditeur favori dans 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
le rendre exécutable
chmod +x /path/to/script/chown_www.sh
et exécuter en tant que root ou via Sudo
Sudo /path/to/script/chown_www.sh
Clause de non-responsabilité: il n'y a pas de vérification d'erreur pour voir si les noms de répertoire sont des utilisateurs viables (et/ou des noms propres).
La find
avec une profondeur minimale/maximale de 1 ne trouvera que les répertoires directement situés sous /var/www/html
- ce que vous voulez.
-type d
s'il y a des fichiers dans /html
.
Ensuite, nous obtenons le nom du répertoire avec basename
et faisons le chown
récursif, comme vous le souhaitiez.
Disclaimer: Ceci est inspiré par l'utilisateur muclux, mais ma modification a été rejetée
Qu'en est-il de find
?
find /var/www/html -mindepth 1 -maxdepth 1 -type d -exec bash -c 'echo chown -R "${0##*/}" "$0"' {} \;
Cela trouvera simplement tous les d
répertoire sous /var/www/html/
et non plus en dessous et exec
ute chown -R
sur chacun d'entre eux. Dans le shell bash $0
est le chemin du répertoire en cours de traitement et ${0##*/}
est le nom du répertoire découpé. J'ai ajouté un echo
ci-dessus pour qu'il imprime chaque commande chown
à exécuter en premier. Si vous êtes satisfait du résultat, exécutez-le sans le echo
.
Si, pour une raison quelconque, vous souhaitez ou avez besoin d’une approche différente pour la tâche, voici quelques alternatives (toutes avec la echo
à tester!), La parallel
étant la plus efficace en cas de énorme nombre de répertoires:
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/*/
Je suppose que vous avez N répertoires sous /var/www/html
et que vous souhaitez modifier le propriétaire de ces répertoires de niveau supérieur uniquement (de manière récursive), c.-à-d.
/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
Si par exemple /var/www/html/domain1
a des sous-répertoires (comme public
, css
, data
), alors ils devraient non appartenir à un utilisateur public
etc. , mais aussi à l'utilisateur domain1
.
Compte tenu de cette condition préalable, le scriptlet suivant fonctionnera (en tant qu'utilisateur 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
Je ne sais pas si votre plan est bon, mais le script suivant pourrait faire l'affaire (appelé avec Sudo). Veuillez noter que vous ne pouvez utiliser que les ID utilisateur existants en tant que propriétaires.
#!/bin/bash
cd /var/www
for file in `find html/*`
do
d=`dirname $file`
p=`basename $d`
chown $p:www-data $file
done
Le script traite les fichiers et les sous-répertoires de la même manière, aucune récursion n’est donc nécessaire.
nom_base (dirname (fichier)) vous donne le nom du répertoire "parent" immédiat.