dans le meme style que le sujet d'un autre posteur
je cherche à pouvoir changer massivement les uid/gid dans un systeme de fichier.
la situation
J'ai un NAS, piloté par un serveur linux dont les uid/gid commencent à 100 (vieux linux embarqué)
Je peux changer les uid/gid en exportant/important les utilisateurs/groupes via un fichier CSV, mais cela ne va pas toucher aux données
pour pouvoir utiliser l'identification centralisée de la société (ldap) et utiliser aussi celle-ci sur les machines recentes, il faut que mes uid/gid soient >10000 pour ne pas etre en conflit avec des comptes locaux linux (qui eux sont >1000)
le probleme
le NAS fait 9To, est accessible par NFS, et je suis root partout si besoin.
actuellement je fais une moulinette bourrine mais pas performante à mon gout.
# recuperation de l'uid à traiter dans le fichier csv
for UID in `cat uids.csv| cut -d ';' -f2`;
do
# un petit echo pour savoir ou j'en suis
echo "Changing owner $UID to 10$UID"
# recherche des fichiers/dossiers ayant cet UID
# et changement de celui ci par changement de propriétaire en 10UID
find -uid $UID -exec chown 10$UID {} \;
done
il va sans dire que j'ai la meme pour les gids avec un chown :10$GID
seulement comme il y a plein de fichiers/dossiers (environ 6To) c'est long.
et j'ai realisé ce matin que j'allais faire 25fois le find car j'ai 25 uid à traiter.
j'ai pensé refaire mon script pour faire le find une fois et faire le chown à la volée (à coup de grep/sed/awk sur l'uid/gid actuel) mais mon cerveau est resté à la maison
ma demande
alors si toi aussi tu veux jouer de la ligne de commande avec moi en ce vendredi de veille de fete, ton aide est la bienvenue.
# A afiner ou pas...
Posté par nono14 (site web personnel) . Évalué à 2.
Selon le homedir de chaque utilisateur, mais s'il existe des répertoires partagés tu n'as pas trop le choix...
Système - Réseau - Sécurité Open Source - Ouvert à de nouvelles opportunités
[^] # Re: A afiner ou pas...
Posté par NeoX . Évalué à 2.
helas pas ou peu de homedir
les homedir c'est 50Go pour tous, alors que les 6To c'est les données des projets
tant pis, je vais laisser tourner alors.
# Parcours dans l'autre sens ?
Posté par khivapia . Évalué à 4.
Pourquoi ne pas lister récursivement tous les fichiers, et pour chaque UID présent dans le fichier csv modifier le propriétaire en conséquence ?
Dans ce cas tu ne parcourras qu'une seule fois l'arborescence de fichiers, mais rechercher si chaque UID est à modifier devrait être rapide (recherche d'un UID parmi 25 possibles).
[^] # Re: Parcours dans l'autre sens ?
Posté par NeoX . Évalué à 2.
oui, c'etait mon autre hypothese
parcourir tous le systeme de fichier (find ...)
et faire un chown intelligent à base de ls/grep/sed/awk pour changer l'uid/gid à la volée.
mais comme je disais mon cerveau est à la maison et moi au boulot
donc si quelqu'un avait deja eu le meme probleme il avait peut-etre un script ou un programme à me proposer.
[^] # Re: Parcours dans l'autre sens ?
Posté par JJD . Évalué à 3.
Quelque chose comme ça :
Il reste au besoin à vérifier que l'uid et le gid des fichiers (variables u et g) sont bien dans la plage à modifier.
A+
JJD
[^] # Re: Parcours dans l'autre sens ?
Posté par bibitte . Évalué à 1.
Pour parcourir arborescence la commande tree le serai pas plus efficace?
(je ne suis pas du tout expert en shell je dis peut -être une énorme bêtise)
[^] # Re: Parcours dans l'autre sens ?
Posté par s[e]th & h[o]lth (site web personnel) . Évalué à 3.
Pour le coup, futé pour futé autant y aller carrément...
En tout cas, merci, j'avais complètement oublié le coup des printf du find...
# micro optimisation ?
Posté par briaeros007 . Évalué à 7.
Y'a tout plein de commentaire essayant de trouver pleins de solution pour optimiser, mais pour ma part je proposerais juste une petite optimisation, ça ne t'empêchera pas de faire 25 fois le find :
donc mon optimisation ;
find -uid $UID -exec chown 10$UID {} \;
devient
find -uid $UID -exec chown 10$UID {} \+
je laisse 5 sec pour trouver la différence ^^
\; -> pour chaque fichier je lance la commande
\+ -> j'essaie de rajouter le max d'arguments à la commande.
Donc optimisation -> on évite de créer un processus à chaque fichier, mais un seul pour n fichiers (n >> 1000).
[^] # Re: micro optimisation ?
Posté par NeoX . Évalué à 3.
fallait y penser et ca semble avoir acceleré le script.
merci à toi.
# python + dictionnaire
Posté par koopa . Évalué à 1.
Si j'étais à ta place, je réécrirai le script en python.
Ça te permettrai d'utiliser un dictionnaire pour directement faire la correspondance entre les anciens et le nouveaux identifiants.
Ainsi tu ne parcourras qu'une seule fois l'arborescence et tu feras les modifications à la volée. Ça sera beaucoup plus simple que du code sed/awk, tout en étant beaucoup plus rapide. (pas besoin de créer des nouveaux processus sans arrêts).
http://docs.python.org/tutorial/datastructures.html#dictionaries
[^] # Re: python + dictionnaire
Posté par NeoX . Évalué à 2.
faut juste que j'apprenne le python pour faire ce que tu me dis ;)
[^] # Re: python + dictionnaire
Posté par Krunch (site web personnel) . Évalué à 2.
En quoi ça serait plus simple que du bash/sed/awk ?
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.