chown -R user: user. * change les permissions en arrière: est-ce le bon comportement?

8

J'ai eu beaucoup de problèmes lors du changement de l'autorisation d'un dossier myfolderrésidant dans /. J'ai émis la commande

sudo chown -R luca:luca /myfolder/.*

Mon intention était de changer la propriété de tous les fichiers cachés dans /myfolder.

Malheureusement, j'ai réalisé que la propriété de a également /été modifiée, ce qui m'a bien sûr laissé un système cassé. Je pense que cela s'est produit à cause des ..matchs .*, mais cela me semble toujours bizarre.

La modification du répertoire parent est-elle le comportement correct ou dois-je déposer un rapport de bogue?

Si c'était mon erreur en utilisant chown, quelles sont les meilleures pratiques à utiliser pour éviter de changer la propriété des dossiers et fichiers système?

lucacerone
la source
4
Il s'agit d'un comportement prévu comme ..match.*
Uwe Plonus
.*signifie tout fichier qui se termine par . *.signifie tout fichier qui commence par.
NickTux
4
@NikTh C'est l'inverse!
Uwe Plonus
Eh bien, une bonne pratique peut être de ne pas modifier /directement (création de dossiers, suppression, etc.) à moins que cela ne soit absolument nécessaire (ouvrez une question pour ce que vous voulez réaliser). Il est également dangereux d'utiliser des caractères génériques + des privilèges root car, le plus souvent, vous n'êtes pas sûr à 100% de ce qui est affecté par le caractère générique.
edwin
1
@LucaCerone Il est lié, chmodet ce chownsont des commandes similaires, toutes deux commencent par ch, contiennent un oet ont deux autres lettres similaires ( net m). </ literal> Sérieusement, ils sont tous deux de la forme: [cmd] -R [mode or user] [one or more files]. Certaines solutions proposées sur cette question fonctionnent également pour votre cas, par exemple celui de Sean Reifschneider (au milieu). Cette réponse s'applique également aux fichiers masqués uniquement en supprimant le modèle glob pour les fichiers non masqués.
Lekensteyn

Réponses:

5

N'oubliez pas que la ligne de commande est développée (interprétée) par le shell avant d'être exécutée

sudo chown -R luca:luca /myfolder/.*

est d'abord interprété comme:

sudo chown -R luca:luca /myfolder/.  /myfolder/.. /myfolder/.adobe  /myfolder/.bash_history

notez le /myfolder/..dans votre ligne de commande

chown -R luca:luca /myfolder/..est équivalent à ce chown -R luca:luca /
qui fait que le chown fonctionne "à l'envers"

À utiliser echo /myfolder/.*lorsque vous utilisez "*" pour vérifier.

Emmanuel
la source
@Emmanuel: pourquoi voudriez-vous utiliser xargs et trouver quand l'option -R est suffisante?
janvier
@Emmanuel: merci! pouvez-vous développer un peu la recherche et les xargs?
lucacerone
@LucaCerone Je ne sais pas pourquoi vous avez accepté celui-ci, il modifie récursivement tous les fichiers /myfolder. La findcommande est superflue et rompt avec les noms de fichiers contenant des espaces. (si vous souhaitez modifier récursivement des fichiers, find /myfolder | xargs chown luca:lucaest similaire à chown -R luca:luca /myfolder).
Lekensteyn
Lekensteyn a raison j'ai oublié de grep ^.
Emmanuel
@Lekensteyn J'ai changé la recherche pour ne pas correspondre à l'espace
Emmanuel
4

Bien. La ligne de commande en tant que root est très puissante. Lisez certains de ces classiques. Et oui, l' .*appariement à ..est exactement ce qui est prévu. Le point n'est pas un caractère spécial. C'est une convention. Par convention, les fichiers qui commencent par un point sont masqués de la vue par défaut lors de l'inscription d'un répertoire - rien de moins et rien de plus. Par convention, l'inode menant au répertoire courant obtient le .nom et l'inode menant au répertoire parent obtient le ..nom.

Ce que vous auriez dû faire était

chown -R luca:luca /myfolder

Ai-je mentionné qu'il n'y a rien de spécial dans les noms de fichiers qui commencent par un point? Récursif chownne le pense pas.

À l'heure actuelle, vous pouvez peut-être récupérer certaines des fonctionnalités en redéfinissant la propriété sur root. À long terme, vous devrez probablement réinstaller le système.

En règle générale:

  1. Évitez de travailler en tant que root.
  2. Si vous travaillez en tant que root, lisez chaque commande deux fois avant d'appuyer sur Entrée.
  3. Si vous n'êtes pas sûr de l'expansion, essayez-le d'abord avec une commande "sûre" (comme echo .*).
  4. Ne fonctionne pas en tant que root.
  5. Il existe de nombreuses tâches qui peuvent être effectuées en toute sécurité à l'aide d'une interface graphique (votre problème est un exemple d'une telle tâche).
  6. Ai-je mentionné que vous devez éviter d'utiliser le compte root?
janvier
la source
Je ne voulais pas changer la propriété de tous les fichiers du dossier ... seulement des fichiers cachés ..
lucacerone
2
OK, ma mauvaise alors. Dans ce cas, chown -R luca:luca /myfolder/.[^.]*je pense
janvier
2
echo .*est un bon moyen d'essayer l'extension. Il vous montrera exactement ce que voit le shell. ls .*peut être un peu plus déroutant, car il descendra dans les répertoires ( ls -d .*peut-être mieux, mais pourrait tout aussi bien utiliser echo .*)
Robie Basak
@RobieBasak bon point!
Janvier