Mover arquivo e preservar proprietário e modo em uma operação atômica

2

Existe uma maneira de mover um arquivo e preservar o proprietário original (grupo) e o modo de arquivo em uma operação atômica? Portanto, não haverá alteração para que outras pessoas acessem o arquivo movido a tempo quando ele ainda não estiver definido como proprietário ou modo original?

Sistema de arquivos é XFS.

    
por isevcik 04.06.2015 / 08:43

3 respostas

1

O requisito agora representa uma operação mv em um arquivo, ou árvore de arquivos, dentro do mesmo sistema de arquivos.

Isso satisfaz os requisitos de atomicidade e propriedade / grupo. Ele também reterá sinalizadores setgid e sticky-bit se a operação for executada como o usuário root . Para arquivos e diretórios normais, qualquer usuário pode se mover, desde que tenha permissão de leitura + gravação + execução para os diretórios-pais de origem e destino (por exemplo, old e new neste exemplo):

mv /path/to/old/source /path/to/new/destination

Veja POSIX mv e POSIX renomear para detalhes precisos.

    
por 05.06.2015 / 00:25
1

Se você estiver movendo o arquivo dentro do mesmo sistema de arquivos, então mv é uma operação atômica . Até certo ponto, o arquivo está no local antigo; depois desse ponto, o arquivo está no novo local. A entrada para o arquivo no diretório antigo é removida e uma nova é adicionada ao novo diretório, em uma única operação. A entrada não é apenas o conteúdo do arquivo, mas todo o inode , incluindo os metadados do arquivo, como o proprietário e as permissões. Não há nenhum ponto em que as permissões sejam modificadas.

Se você estiver movendo o arquivo para um sistema de arquivos diferente , a operação não é atômica: envolve a criação de um novo arquivo e a modificação do conteúdo e dos metadados até que eles correspondam ao arquivo antigo. e removendo o arquivo antigo. Um novo arquivo é sempre criado vazio e pertencente ao usuário que o criou. O criador pode definir as permissões tradicionais do Unix assim que o arquivo é criado, mas não as listas de controle de acesso.

Você pode controlar o proprietário inicial, o grupo e o modo do novo arquivo executando mv como proprietário e grupo desejados e definindo umask como o complemento das permissões do arquivo. Aqui está um método shell do Linux, assumindo que o usuário e o grupo existam e tenham um shell estilo Bourne como seu shell de login:

set $(stat -c '%U %G %a' "$original_file")
export user=$1 group=$2 mode=0$3 original_file destination
su "$user" -c 'sg "$group" -c "umask $((07777 & ~mode)) && touch "$destination" && mv -- "$original_file" "$destination"'

Isso é muito complicado, e o arquivo será criado com a propriedade e permissões corretas, mas com conteúdos diferentes, timestamps diferentes, etc. Se você não quiser que o arquivo fique visível até que seja totalmente reproduzido, primeiro mova o arquivo para um diretório temporário no sistema de arquivos de destino que é visível apenas para o root e, em seguida, move o arquivo atomicamente para o local.

d=$(TMPDIR="$(dirname -- "${destination}")" mktemp -d)
chmod 700 "$d"
mv -- "$original" "$d/file"
mv -- "$d/file" "$destination"
rmdir d
    
por 05.06.2015 / 02:52
1

Estas são algumas maneiras de fazer isso; embora não atômico, deve ser seguro o suficiente para as suas necessidades.

  • Você pode copiar o arquivo usando o sinal -p para preservar permissões e propriedade e, em seguida, remover o arquivo original: cp -p /old/path/file /new/path/ && rm -f /old/path/file

  • Você pode usar o rsync: rsync -pogXA --remove-source-files /old/path/file /new/path/

  • Se você for o usuário root, poderá chmod 000 do arquivo, movê-lo e restaurar o proprietário e as permissões apropriados.

por 04.06.2015 / 10:25

Tags