web-dev-qa-db-fra.com

Comment puis-je créer une vue en écriture seule d'un dossier?

Je veux avoir une place sur le système de fichiers qui présente une "vue" en écriture seule d'un autre dossier auquel j'ai un accès en lecture-écriture.

J'imagine quelque chose qui a un comportement similaire à celui d'une boîte de dépôt FTP, où les fichiers peuvent y être copiés mais pas lus, par exemple:

$ ls read-write-view/ write-only-view/
read-write-view/:
a  b  c

write-only-view/:

$ cp d write-only-view/
$ ls read-write-view/ write-only-view/
read-write-view/:
a  b  c  d

write-only-view/:

Il est important que cela fonctionne comme dans l'exemple - le contenu est toujours visible lors de l'accès via read-write-view/, et les deux "vues" sont fonctionnelles pour un seul utilisateur.

Comment puis-je organiser quelque chose comme ça? Un arrangement judicieux de liens symboliques, peut-être? Ou une configuration inhabituelle d'un montage de liaison?

11
ændrük

Utilisez bindfs , conçu pour "monter un répertoire dans un autre emplacement et modifier les bits d'autorisation".

Commencez avec un dossier normal disposant d'un accès en lecture et en écriture:

$ mkdir read-write-view && touch read-write-view/{a,b,c}
$ ls read-write-view
a  b  c

Utilisez bindfs pour monter le dossier sans accès en lecture:

$ mkdir write-only-view
$ Sudo bindfs --perms=a-r read-write-view write-only-view

Vérifiez que seul le contenu du dossier d'origine peut être répertorié:

$ ls read-write-view write-only-view
read-write-view:
a  b  c
ls: cannot open directory write-only-view: Permission denied

Vérifiez que le dossier d'origine peut être écrit via le montage:

$ echo 'Can you read this?' > write-only-view/d
$ cat read-write-view/d
Can you read this?

Vérifiez que les fichiers ne peuvent pas être lus via le montage:

$ cat write-only-view/d
cat: write-only-view/d: Permission denied
1
ændrük

J'ai posé cette même question pour les boîtes de dépôt d'étudiants sur la liste de diffusion samba il y a quelques années (http://lists.samba.org/archive/samba/2008-september/143610.html) et la réponse a fonctionné pour nous. Vous avez besoin d'attributs acl étendus sur votre système de fichiers (à partir du paquet acl), voici la réponse de Jeremy Allison ...

Ok, le problème est que les étudiants doivent être capables de lire le répertoire contenant pour pouvoir y glisser-déposer de nouveaux fichiers. La raison en est que Samba doit pouvoir analyser le répertoire en son nom afin de pouvoir effectuer des recherches insensibles à la casse.

Mais aussi longtemps que vous ne souhaitez pas que les étudiants voient les noms de leurs fichiers respectifs, vous pouvez configurer une DropBox afin que les étudiants puissent y écrire (et leurs propres fichiers) sans les éditer ni les voir.

Tout d'abord, vous voulez vous assurer que les fichiers créés dans le répertoire DropBox n'appartiennent pas au groupe principal de l'étudiant, mais au propriétaire du groupe du répertoire DropBox. Alors :

enseignants chgrp DropBox

pour le faire appartenir au groupe d'enseignants. Ensuite, définissez le bit setgid sur le répertoire DropBox pour vous assurer que les fichiers créés au sein de celui-ci ont un groupe de professeurs.

chmod g + s DropBox

Assurez-vous ensuite qu’un fichier dans DropBox peut être renommé ou supprimé par le seul propriétaire du fichier, ou par le propriétaire du répertoire, ou par root (mêmes autorisations que/tmp).

chmod + t DropBox

Autorisez ensuite les étudiants à écrire dans le répertoire en ajoutant une ACL.

setfacl -m g: étudiants: rwx DropBox

Tant que defaul acl est défini de sorte que "les autres" ne disposent pas d’autorisations, les fichiers écrits par un élève dans ce répertoire seront possédés par lui-même mais auront un groupe de "professeurs", et les étudiants ne pourront pas les lire autres fichiers.

Si vous devez faire en sorte que les fichiers appartiennent au propriétaire du répertoire et non aux étudiants qui les ont créés, vous devez configurer un partage séparé comme décrit ci-dessus, puis ajouter le paramètre de niveau de partage:

hériter propriétaire = oui

ce qui fera que les fichiers créés dans les répertoires de ce partage seront possédés par le répertoire qui les contient, et non par le propriétaire qui les crée.

1
user55604

Vous pouvez y parvenir en définissant les autorisations sur le dossier de sorte que les utilisateurs cibles disposent d'un accès en écriture sur le dossier mais pas d'un accès en lecture.

Par exemple, pour permettre à quiconque d'écrire dans un dossier sans en lister le contenu, procédez comme suit:

chmod o=wx folder

Ou seulement pour donner cet accès à un groupe d'utilisateurs particulier:

chgrp groupname folder
chmod o=,g=wx folder

Désormais, ces utilisateurs ne pourront pas répertorier le contenu du dossier mais pourront placer des fichiers dans le dossier:

$ ls folder
ls: cannot open directory folder: Permission denied
$ touch folder/filename

Cela ne fait pas tout ce que vous voulez, car si les utilisateurs peuvent toujours accéder aux fichiers du dossier, ils peuvent deviner le nom. Vous pouvez réduire ce risque grâce à une tâche cron qui déplace régulièrement des fichiers du dossier de la boîte de dépôt vers un emplacement auquel d'autres utilisateurs n'ont pas accès.

1

Vous pouvez créer un dossier de dépôt "write-only-view" avec un accès rw et utiliser cronjob ou inode notification pour déplacer le contenu vers l'autre "lecture-écriture-vue".

1
jet

Je crois que vous pourriez simplement utiliser la supercherie de bind, dans /etc/fstab:

/path/to/read-write-view /path/to/write-only-view none bind 0 0

Donc, vous pourriez probablement alors:

chmod a=wx /path/to/write-only-view
chmod a=rwx /path/to/read-write-view
1
Glen

Ce n'est pas une réponse, mais vraiment une pensée et peut-être une autre question. Pour moi, cela semble pouvoir être mis en œuvre par une sorte de crochet ou de déclencheur.

Certains programmes en arrière-plan peuvent regarder le dossier en écriture seule (et non par sondage, ils peuvent être notifiés avec FAM ou quelque chose du genre) puis déplacer chaque fichier de celui-ci en lecture seule. dossier dès qu'il apparaît.

0
MPi

Je ne pense pas que cela soit possible, car vous devez lire un disque "en écriture seule" pour afficher le contenu.

Si je devais vendre un tel appareil, comment pourrait-on vérifier qu'il fonctionnait? Peut-être que c'est un pour Kickstarter.

0
gecko

Premièrement, il est plus facile d’y penser à l’inverse. Vous avez un dossier qui est rw pour quiconque a besoin d'un accès en écriture et une "vue" en lecture seule de ce dossier pour ceux qui ont besoin d'un accès en lecture seule.

Je n'ai jamais réussi à faire fonctionner l'option mount --bind -o ro. Le moyen le plus fiable de le faire est d'utiliser nfs. Ajoutez ce qui suit dans/etc/exports

/path-to-folder/folder 127.0.0.1(secure,ro,no_root_squash)

puis montez la "vue" en lecture seule avec

mount -o ro 127.0.0.1:/path-to-folder/folder /read-only-folder

Vous devriez maintenant avoir une vue en lecture seule de votre dossier d'origine.

Je suppose que vous pourriez faire la même chose avec samba/cifs, mais cela n’aurait vraiment de sens que pour un accès réseau.

Cette solution a été inspirée par ( volé à ) ce Howto . J'espère que ça aide.

0
Chris