Maneira boa e fácil de compartilhar arquivos na máquina local

13

Eu gostaria de ter um diretório que possua as seguintes propriedades:

  • Muitos usuários podem copiar arquivos para ele
  • Esses arquivos podem ser excluídos / alterados por esses usuários (o usuário A pode excluir / modificar o arquivo que foi copiado neste diretório)

isso não pode ser feito usando permissões de arquivo normais (porque as permissões são mantidas na cópia).

Aqui está o que eu encontrei na net:

Alguns casos de uso:

  • Compartilhando músicas na máquina local
  • Compartilhamento simples de repositório git (apenas torne um repositório simples gravável para muitas pessoas) --- eu sei que existem soluções como gitosis
  • Permitir que muitos desenvolvedores modifiquem a instância de teste do aplicativo php sem dar raiz (acho que eles copiam arquivos) --- Estou liderando uma equipe de desenvolvedores juniores sem fins lucrativos e preciso manter isso simples!

EDITAR

A configuração do AFAIK, o bit SGID, não é suficiente, afeta apenas os arquivos recém-criados - e o fluxo de trabalho básico para esses casos de uso envolve a cópia e outras operações (que reduzem o gid do arquivo)

jb.
fonte

Respostas:

9

Listas de controle de acesso

A resposta direta são as listas de controle de acesso (ACLs) . Sim, você pode encontrar um contra-exemplo, mas eles são bons o suficiente na prática (ao contrário da mera gravabilidade em grupo, que exige que os usuários pensem nisso o tempo todo). O que eles exigem é que o administrador do sistema (raiz) defina os grupos, se você deseja que os arquivos sejam compartilhados apenas por um grupo nomeado (o raiz pode optar por delegar, por exemplo, aceitando grupos do LDAP, mas isso é outra história).

Você precisa que os usuários participantes tenham uma umask de 022. Se eles criarem arquivos não legíveis por mundo rotineiramente, esse esquema não funcionará. Mas se eles têm uma umask restritiva, é provável que não desejem compartilhar arquivos de qualquer maneira.

Ativando ACLs

O Ubuntu não habilita ACLs por padrão, então há um requisito de administração único. Edite /etc/fstabusando seu editor favorito e altere todas as linhas correspondentes a um sistema de arquivos em que você deseja compartilhar arquivos: adicione aclàs opções. (Certifique-se de não alterar nenhuma outra linha e de não usar um editor que agrupe linhas longas.) Aqui está um exemplo de linha com a aclopção adicionada:

UUID=5e1ec7ed-face-dead-beef-c011ec7ab1e5  /  ext4  errors=remount-ro,acl  0 1

Para que a opção entre em vigor na primeira vez, use um comando como o seguinte (para cada sistema de arquivos):

sudo mount -o remount,acl /

Instale as ferramentas ACL do aclpacote.

Configurando o Diretório Compartilhado

Para ter arquivos compartilhados pelo grupo mygroup:

setfacl -m group:mygroup:rwx /path/to/shared/root
setfacl -d -m group:mygroup:rwx /path/to/shared/root

Se as pessoas criarem arquivos e os copiarem para o diretório compartilhado, os arquivos ficarão legíveis por todo o mundo (por causa do umask) e qualquer pessoa no grupo poderá adicionar e remover arquivos (porque o grupo é gravável em grupo). As pessoas não podem editar os arquivos umas das outras, mas isso é bom ou você pode ter conflitos de edição imediatamente.

Se você não possui um grupo unix, pode adicionar usuários um por um:

setfacl -m user:bob:rwx /path/to/shared/root
setfacl -d -m user:bob:rwx /path/to/shared/root

Controle de versão

Se você deseja que as pessoas possam editar arquivos no local, também precisa de algo para evitar conflitos de edição. Isso é controle de versão.

Você não precisa disso para compartilhar um repositório git. Você sabe que existem soluções como gitosis, então use-as.

Gilles 'SO- parar de ser mau'
fonte
A ACL funcionaria perfeitamente se a herança automática não fosse quebrada pelo cp (e mv?) Que descarta (ignora) a acl padrão definida no nível do diretório de destino.
útil
2

Simplesmente faça o seguinte:

mkdir /src/teamA
addgroup teamA
chgrp teamA /src/teamA
chmod g+rws /src/teamA

Agora todos no teamAgrupo podem fazer tudo por dentro/src/teamA

A mágica é o bit sgid (definir identificação do grupo) no diretório

shellholic
fonte
AFAIK não vai funcionar, veja post
jb
1

Se você deseja que os usuários possam acessar arquivos em uma pasta compartilhada (por exemplo, pessoas diferentes fazem logon na mesma máquina em momentos diferentes e precisam acessar os mesmos arquivos), pode usar bindfspara criar um diretório compartilhado.

Ele permite que vários usuários locais leiam e gravem (criem, excluam, renomeiem, modifiquem ...) todos os arquivos (incluindo os recém-criados) de um diretório compartilhado e seus subdiretórios. Cada usuário verá os arquivos e pastas (incluindo os recém-criados) como pertencentes a eles.

Resumidamente, você corre

sudo bindfs -o perms=0700,mirror-only=user1:user2:user3 /home/shared /home/shared

para tornar / home / shared disponível para user1, user2 e user3.

Instruções

Consulte Bindfs-SharedDirectoryLocalUsers (documentação do Ubuntu) para obter instruções completas, incluindo a configuração permanente (sempre que você liga o computador). Uso isso em minha própria máquina para vários diretórios, cada um com diferentes grupos de compartilhamento (uma pasta está disponível para todas as contas, outra apenas para contas comerciais, outra apenas para contas pessoais).

Da postagem:

bindfs é um sistema de arquivos FUSE para montar um diretório em outro local (ponto de montagem), com configurações de permissão. Ele permite que você especifique a propriedade e as permissões dos arquivos de dentro do ponto de montagem.

...

O principal benefício é que os novos arquivos criados no diretório compartilhado herdarão a propriedade e as permissões.

Listas de controle de acesso (ACLs)

A documentação observa:

Se você deseja configurar permissões mais avançadas para diferentes usuários e / ou grupos, tente Listas de controle de acesso .

Veja a resposta de Gilles para mais detalhes.

david.libremone
fonte
se você está tendo problemas para adicionar bindfs no oneiric, pode obter pacotes criados pelo usuário aqui bugs.launchpad.net/ubuntu/+source/bindfs/+bug/851600
david.libremone
-3

Você pode combinar a solução do shellholic com um trabalho cron que atualiza o gid para todos os arquivos nessa pasta a cada 15 segundos ou algo semelhante.

David Oneill
fonte