Masquer des fichiers sous Linux sans utiliser le point

32

Je souhaite masquer des fichiers sous Linux sans utiliser le point, car c'est possible sous Windows.

Y a-t-il un moyen de faire cela?

aWebDeveloper
la source
6
Gardez à l'esprit que le fait de cacher des fichiers (obscurcissement) ne remplace pas la sécurité (restriction d'accès)
uSlackr

Réponses:

26

Vous ne pouvez pas. Il existe une différence fondamentale dans la façon dont les systèmes de fichiers gèrent les paramètres masqués. Sous Windows, le système de fichiers stocke plusieurs attributs pour le fichier dans les métadonnées, y compris les attributs "caché" et "système" (qui sont tous deux des types de fichiers cachés). Dans les systèmes de fichiers communs * nix, aucun de ces attributs n'est stocké. Au lieu de cela, les informations doivent être placées ailleurs, comme dans le nom de fichier. La convention est donc que les fichiers commençant par. (et selon votre système, peut-être que certains autres comme _) ne seront pas affichés par la plupart des outils par défaut.

C'est uniquement pour des raisons de commodité, a. commencer un nom de fichier ne signifie absolument rien mais "l'utilisateur ne veut probablement pas voir ça tout le temps". Pour vous assurer que vous le savez, exécuter par exemple ls -aaffichera tous les fichiers.

Si vous ne voulez pas qu'un fichier encombre vos listes sous Linux, vous devez le renommer pour commencer par un point (Bonus: cela fonctionnera aussi pour OS X, si nous parlons d'un appareil portable). Si vous ne voulez pas que les utilisateurs puissent trouver un fichier, vous le faites mal - c'est à cela que servent les autorisations.

Les autorisations Unix car elles se rapportent aux répertoires confondent souvent les gens, et peut-être que mieux le comprendre vous aidera. Les autorisations "lire" et "exécuter" ( ret x) signifient quelque chose de différent pour les répertoires que pour les fichiers. Pour les répertoires, l' xautorisation d' exécution détermine si vous accédez ou non aux inodes du répertoire. L' rautorisation de lecture détermine si vous pouvez ou non accéder à la liste du répertoire. Fonctionnellement, xpermet à l'utilisateur de faire des choses dans un répertoire, tandis que l' rautorisation lui permet de voir ce qu'il contient. Ce sont différents, et la différence peut être déroutante. Regardons un exemple:


jeanluc@login64: ~ $ mkdir example
jeanluc@login64: ~ $ echo "you can read it" > example/file
jeanluc@login64: ~ $ ls example/
file
jeanluc@login64: ~ $ cat example/file
you can read it

jeanluc@login64: ~ $ chmod -x example/
jeanluc@login64: ~ $ ls example/
ls: cannot access example/file: Permission denied
file
jeanluc@login64: ~ $ cat example/file
cat: example/file: Permission denied
jeanluc@login64: ~ $ cd example/
-bash: cd: example/: Permission denied

jeanluc@login64: ~ $ chmod +x example/
jeanluc@login64: ~ $ chmod -r example/
jeanluc@login64: ~ $ ls example/
ls: cannot open directory example/: Permission denied
jeanluc@login64: ~ $ cat example/file
you can read it
jeanluc@login64: ~ $ cd example/
jeanluc@login64: ~/example $ ls
ls: cannot open directory .: Permission denied
jeanluc@login64: ~/example $ cd ..

Donc, notez que sans exécuter, je peux toujours lister les fichiers (bien que ls affiche une erreur car il ne peut pas obtenir les propriétés du fichier), mais je ne peux pas changer dans le répertoire ou lire les fichiers qu'il contient. Sans lecture, je ne peux pas lister les fichiers, mais je peux toujours me déplacer dans le répertoire et si je connais le nom d'un fichier, je peux toujours y accéder.

Notez cependant que la suppression de l'autorisation de lecture ne vous donne que la sécurité par l'obscurité. Si l'utilisateur devine le nom du fichier, il pourra lire son contenu.

Cela n'a peut-être pas vraiment été pertinent pour votre question, je voulais juste m'assurer que vous compreniez les autorisations de répertoire.

jcrawfordor
la source
26

Créez un fichier .hiddendans le répertoire avec les noms des fichiers à masquer (un nom par ligne).

Ajoutez ensuite ce qui suit à votre ~/.bashrc:

ls () {
  if [ -f .hidden ]; then
    declare GLOBIGNORE="$GLOBIGNORE:.*:$(tr '\n' ':' < .hidden)"
    ls "$@"
  fi
}

Maintenant, votre lscommande ne répertorie pas ces fichiers.

J'utilise cette technique pour masquer mes fichiers __pycache__et __init__.py.


EDIT: selon un autre commentaire, cela les cache également dans au moins un (Nautilus), mais probablement plusieurs navigateurs de fichiers GUI également.

A Sz
la source
c'est intéressant. Fonctionne-t-il également dans le nautile ou dans d'autres outils graphiques? Pouvez-vous voir les fichiers avec ls -al?
Jakuje
1
le code manque un '"à la fin. (et au cas où vous vous demandez d'où viennent les votes positifs : askubuntu.com/a/713591/15811 ) ;-)
Rinzwind
14

Vous pouvez réellement masquer des fichiers sous Linux sans ajouter de point. Cela les cache en fait dans Nautilus; un à lspartir de la ligne de commande répertorie toujours les fichiers.

  1. Créez un fichier texte nommé .hiddendans le dossier dans lequel vous souhaitez masquer les fichiers.
  2. Ajoutez les noms des fichiers ou dossiers que vous souhaitez masquer, un par ligne, au fichier.
  3. Actualisez votre navigateur de fichiers.
Faire
la source
2
ne fonctionne pas ici avec "ls" dans debian 5.0. Est-ce spécifique au nautile ou au dauphin ou ...?
Tim Haegele
2
Les fichiers sont cachés dans Nautilus; pas dans les lslistes.
À faire le
1
solution juste génial! :)
Merianos Nikos
4

Un point est utilisé pour masquer les fichiers sous Linux, et cela ne peut pas être modifié.

Cependant, vous pouvez jouer avec les autorisations de fichier pour empêcher les utilisateurs d'avoir accès au dossier / fichier donné. Essayez d'expérimenter avec la chmodcommande.

bbaja42
la source
2

Essayez-vous uniquement de masquer les fichiers du gestionnaire de fichiers et / ou de l'environnement de bureau de votre interface utilisateur graphique? Si c'est le cas, il pourrait y avoir des options au-delà du simple préfixage du nom de fichier par un point.

Je crois que les fichiers ne supplémentaires cachés par un gestionnaire de fichiers Linux sont des fichiers de sauvegarde, à savoir ceux qui se terminent dans un tilde ~ou .bakou tout ce qu'ils croient est l'extension de sauvegarde. Dans tous les cas, vous avez probablement de la chance si tout ce que vous souhaitez faire est de cacher les fichiers de sauvegarde du gestionnaire de fichiers.

Ne donnez pas à vos fichiers une extension de sauvegarde pour les cacher ou ils pourraient être supprimés accidentellement !!

En passant, vous pouvez masquer des fichiers du Finder dans Mac OS X à l'aide de la commande SetFile -a V [file]ou de la modification, /.hiddenmais cela ne masquera évidemment pas le fichier du programme de la ligne de commande ls.

Jeff Burdges
la source
3
Sous OS X, vous pouvez également masquer les fichiers par chflags hidden filename.
slhck
2

Si vous avez des compétences en programmation et si seulement ce dont vous avez besoin est de cacher les noms de fichiers pour que l'utilisateur convienne de ne pas encombrer l'espace visuel, vous pouvez le pirater!

Je ne considérerai que les outils de ligne de commande, car ils sont assez uniformes et sont les seuls outils constamment utilisés par moi.

Il existe de nombreuses façons de stocker ces informations:

  1. Vous pouvez stocker l'attribut étendu "caché" dans les fichiers sélectionnés. Voirman attr

      attr -s hidden -V true your_file
    
  2. Ou comme mentionné ci-dessus, vous pouvez stocker la liste des noms de fichiers dans un .hiddenfichier

Important: Cela ne fonctionnera pas hors de la boîte que vous devez implémenter la logique, les systèmes propres ignoreront simplement les .hiddenfichiers et hiddenles attributs étendus!

Il existe également plusieurs implémentations possibles:

  1. Si vous n'avez que peu de fichiers, écrivez votre .bashrcfichier

    alias ls='ls -I filename_1 -I filename_2'
    

    man ls pour plus d'informations.

  2. Écrivez un function lstel qu'il gère toute la logique derrière la reconnaissance des fichiers cachés et l'assemblage de la liste de toutes les -Ientrées, puis l'exécution /bin/lsavec les indicateurs d'ignorance appropriés. Tâche très laborieuse, car vous devez gérer tous les lsparamètres correctement.

  3. Obtenez des sources de coreutils

    git clone git://git.sv.gnu.org/coreutils
    

    ou

    git clone git://git.suckless.org/sbase
    

    Appliquez-le comme vous le souhaitez pour gérer votre implémentation de fichiers cachés. Et placez-le dans votrePATH

    Je l'ai piraté en moins de 5 minutes en utilisant des sources sans succion et le diff est comme ceci:

     diff --git a/ls.c b/ls.c
     index cdfce4d..8197409 100644
     --- a/ls.c
     +++ b/ls.c
     @@ -214,6 +214,17 @@ lsdir(const char *path)
             first = 0;
             while ((d = readdir(dp))) {
     +///////////////////////////////////////////////
     +// Dirty hack to implement hidden files
     +// FIXME: Make proper(!) subroutine
     +               char attr_command[1024] = "attr -Lqg hidden "; // Oh, dear. That's bad
     +               int attr_code;
     +               strcat(attr_command, d->d_name);
     +               strcat(attr_command, " >/dev/null 2>&1");
     +               attr_code = system(attr_command);
     +               if (!attr_code)
     +                       continue;
     +///////////////////////////////////////////////
                     if (d->d_name[0] == '.' && !aflag && !Aflag)
                             continue;
                     else if (Aflag)
    
Aleksy Grabowski
la source
ls.créside dans src, pas le répertoire racine, et il n'y a pas de fonction lsdirdans ls.c.
Melab
2

C'est la meilleure solution que j'ai trouvée, ajoutez à votre profil :

alias ls="/bin/ls --color=auto --ignore='*.egg-info' --ignore='__pycache__'"

Si vous avez besoin de plus de modèles, ajoutez simplement plus de --ignoredrapeaux.

jsmedmar
la source
Cela va conduire à une chaîne très, très longue si plus de quelques fichiers doivent être cachés. Pour plusieurs fichiers, il existe des moyens plus efficaces de le faire, mais pour quelques fichiers, une bonne solution néanmoins.
JW0914
2

De nos jours, vous pouvez écrire FUSE qui cache les fichiers en fonction de la configuration donnée.

Cet article me fait croire que vous devez modifier la getdirfonction:

getdir: int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t);
Cela lit le contenu d'un répertoire. Cette opération est opendir(), readdir()..., closedir()séquence dans un appel. Pour chaque entrée de répertoire, la filldir()fonction doit être appelée.

Je ne suis pas programmeur mais j'imagine qu'on pourrait faire getdiromettre tous les fichiers listés dans (par exemple) un .hiddenfichier. Si vous l'implémentez correctement, tous les outils (GUI ou non) seront affectés.

Kamil Maciorowski
la source
1

Vous pouvez « cacher » le contenu d'un répertoire en enlevant « x » perms pour le groupe, ou autre: chmod go-x directoryname. Vous ne pouvez plus répertorier les fichiers, mais vous pouvez accéder à un fichier si vous connaissez le chemin exact. Cela ne ressemble pas à ce que vous voulez.

Gardez à l'esprit que la chose dotfile est une commodité, pas vraiment pour cacher le fichier pour des raisons de sécurité, mais pour réduire l'encombrement des fichiers lors de la liste des fichiers. Il est intégré dans lsles autres outils.

Rich Homolka
la source
Et c'est également faux. Bien que la suppression des autorisations de lecture d'un répertoire vous empêche de répertorier son contenu, la suppression de la permission d'exécution refusera tout accès au répertoire. Lorsque vous n'êtes pas autorisé à exécuter un répertoire, vous n'aurez accès à rien au-delà. Pas même s'il y a un sous-répertoire avec tous les droits et que vous connaissez son chemin.
Bachsau