Como posso fazer uma exibição somente gravação de uma pasta?

12

Quero ter um lugar no sistema de arquivos que apresente uma "exibição" somente para gravação de outra pasta à qual tenho acesso de leitura e gravação.

Estou imaginando algo com comportamento semelhante a uma caixa de seleção FTP, onde arquivos podem ser copiados para ela, mas não lidos, por exemplo:

$ 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/:

É importante que isso funcione como no exemplo - o conteúdo ainda é visível quando acessado read-write-view/e as duas "visualizações" são funcionais para um único usuário.

Como posso configurar algo assim? Algum arranjo inteligente de elos simbólicos, talvez? Ou uma configuração incomum de uma montagem de ligação?

ændrük
fonte

Respostas:

2

Eu fiz essa mesma pergunta para caixas de seleção de alunos na lista de email do samba há alguns anos (http://lists.samba.org/archive/samba/2008-September/143610.html) e a resposta funcionou para nós. Você precisa de atributos estendidos de acl no seu sistema de arquivos (do pacote acl), aqui está a resposta de Jeremy Allison ...

Ok, o problema é que os alunos precisam ler o diretório que contém para poder arrastar e soltar novos arquivos lá. O motivo é que o Samba precisa poder verificar o diretório em seu nome para fazer pesquisas que não diferenciam maiúsculas de minúsculas.

Mas, desde que você não se importe em permitir que os alunos vejam os nomes dos arquivos uns dos outros, você pode configurar um DropBox para que eles possam escrever nele (e em seus próprios arquivos), mas não editar ou ver outros arquivos.

Primeiro, você deseja garantir que os arquivos criados no diretório DropBox não sejam de propriedade do grupo principal do aluno, mas do proprietário do grupo do diretório de diretórios do DropBox. Então :

professores do chgrp DropBox

para pertencer ao grupo de professores. Em seguida, defina o bit setgid no diretório DropBox para garantir que os arquivos criados lá tenham um grupo de professores proprietários.

Dropmod do chmod g + s

Em seguida, verifique se um arquivo no DropBox pode ser renomeado ou excluído apenas pelo proprietário do arquivo, pelo proprietário do diretório ou pela raiz (mesmas permissões que / tmp possui).

chmod + t DropBox

Em seguida, permita que os alunos escrevam no diretório adicionando uma ACL

setfacl -mg: alunos: rwx DropBox

Desde que o defaul acl esteja definido para que "outros" não tenham permissões, os arquivos gravados por um aluno nesse diretório serão de propriedade deles, mas terão um grupo de "professores" e os alunos não poderão ler cada outros arquivos.

Se você precisar fazer com que os arquivos sejam de propriedade do proprietário do diretório, não dos alunos que os criaram, será necessário configurar um compartilhamento separado, conforme descrito acima, mas adicionar o parâmetro de nível de compartilhamento:

herdar proprietário = sim

que fará com que os arquivos criados nos diretórios desse compartilhamento sejam de propriedade do diretório que contém, não do proprietário da criação.

user55604
fonte
1

Você pode conseguir isso definindo as permissões na pasta para que os usuários de destino tenham acesso de gravação à pasta, mas não acesso de leitura.

Por exemplo, para permitir que alguém grave em uma pasta, mas não liste seu conteúdo, você pode fazer o seguinte:

chmod o=wx folder

Ou para conceder apenas a um grupo específico de usuários:

chgrp groupname folder
chmod o=,g=wx folder

Agora, esses usuários não poderão listar o conteúdo da pasta, mas poderão colocar os arquivos na pasta:

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

Isso não faz tudo o que você deseja, pois se os usuários ainda puderem acessar os arquivos na pasta, poderão adivinhar o nome. Você pode minimizar esse risco por meio de um trabalho cron que movia regularmente arquivos da pasta da caixa de depósito para um local ao qual outros usuários não têm acesso.

James Henstridge
fonte
1

Você pode criar uma pasta suspensa "exibição somente leitura" com acesso rw e usar a notificação cronjob ou inode para mover o conteúdo para a outra "exibição leitura / gravação".

jato
fonte
1

Eu acredito que você poderia simplesmente usar truques de montagem de ligação, em /etc/fstab:

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

Então, você provavelmente poderia:

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

Use bindfs , projetado para "montar um diretório em outro local e alterar os bits de permissão".

Comece com uma pasta normal que tenha acesso de leitura e gravação:

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

Use bindfs para montar a pasta sem acesso de leitura:

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

Verifique se apenas o conteúdo da pasta original pode ser listado:

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

Verifique se a pasta original pode ser gravada através da montagem:

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

Verifique se os arquivos não podem ser lidos através da montagem:

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

Primeiro, é mais fácil pensar nisso ao contrário. Você tem uma pasta rw para quem precisa de acesso de gravação e uma "visualização" somente leitura desta pasta para aqueles que precisam de acesso somente leitura.

Nunca consegui fazer com que a opção mount --bind -o ro funcionasse corretamente. A maneira mais confiável de fazer isso é usar o nfs. Adicione o seguinte a / etc / exportações

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

depois monte a "visualização" somente leitura com

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

Agora você deve ter uma exibição somente leitura da sua pasta original.

Suponho que você possa fazer a mesma coisa com samba / cifs, mas isso só faria sentido para o acesso à rede.

Esta solução foi inspirada por ( roubada ) deste Howto . Espero que ajude.

Chris
fonte
Não estou perguntando sobre uma exibição somente leitura, apenas leitura e gravação e somente gravação.
ændrük
0

Eu não acho que isso seja possível, pois você precisa ler um disco "somente gravação" para exibir o conteúdo.

Se eu vendesse esse dispositivo, como alguém seria capaz de verificar se ele funcionava? Talvez este seja o caso do kickstarter.


fonte
0

Esta não é uma resposta, mas realmente mais um pensamento e possivelmente outra pergunta. Para mim, isso soa como se pudesse ser implementado através de algum tipo de gancho ou gatilho.

Alguns programas em segundo plano podem assistir à pasta somente gravação (não por polling, ela pode ser notificada pelo FAM ou algo assim) e depois mover cada arquivo para a pasta somente leitura assim que aparecer.

MPi
fonte