Como copiar um diretório cuja raiz não pode acessar um diretório que somente a raiz pode acessar?

11

Eu tenho um diretório em uma montagem nfs, que no servidor está em /home/myname/.rubies

A raiz não pode acessar este diretório:

[mitchell.usher@server ~]$ stat /home/mitchell.usher/.rubies
  File: `/home/mitchell.usher/.rubies'
  Size: 4096            Blocks: 8          IO Block: 32768  directory
Device: 15h/21d Inode: 245910      Links: 3
Access: (0755/drwxr-xr-x)  Uid: (  970/mitchell.usher)   Gid: (  100/   users)
Access: 2016-08-22 15:06:15.000000000 +0000
Modify: 2016-08-22 14:55:00.000000000 +0000
Change: 2016-08-22 14:55:00.000000000 +0000

[mitchell.usher@server ~]$ sudo !!
sudo stat /home/mitchell.usher/.rubies
stat: cannot stat `/home/mitchell.usher/.rubies': Permission denied

Estou tentando copiar algo desse diretório para o /optqual apenas o root tem acesso:

[mitchell.usher@server ~]$ cp .rubies/ruby-2.1.3/ -r /opt
cp: cannot create directory `/opt/ruby-2.1.3': Permission denied

[mitchell.usher@server ~]$ sudo !!
sudo cp .rubies/ruby-2.1.3/ -r /opt
cp: cannot stat `.rubies/ruby-2.1.3/': Permission denied

Obviamente, posso fazer o seguinte (e é o que fiz por enquanto):

[mitchell.usher@server ~]$ cp -r .rubies/ruby-2.1.3/ /tmp/
[mitchell.usher@server ~]$ sudo cp -r /tmp/ruby-2.1.3/ /opt/

Existe alguma maneira de fazer isso que não envolva copiá-lo como uma etapa intermediária ou alterar permissões?

Mitch
fonte
cp -Rp /home/mitchell.usher/.rubies /tmp/templocation; sudo mv /tmp/templocation/ruby-2.1.3 /optisso não vai funcionar? Se não, por quê?
MelBurslan
@MelBurslan foi o que eu fiz, como indicado na pergunta. Mas digamos que seja um arquivo de 50 GB que não se encaixa em nenhum outro lugar no sistema de arquivos, então eu não seria capaz decp <file> /tmp/tmpfile
Mitch Mitchell

Respostas:

29

Você pode usar tarcomo um processo de buffer

cd .rubies
tar cf - ruby-2.1.3 | ( cd /opt && sudo tar xvfp - )

O primeiro taré executado conforme você e, portanto, pode ler seu diretório pessoal; o segundo taré executado sob sudoe, portanto, pode escrever para /opt.

Stephen Harris
fonte
1
Como isso está na memória? Se eu tiver um arquivo de 10 GB, ele preencherá 10 GB de memória antes de ser canalizado e removido do tarte, ou será removido do tar como tarado?
Mitch
5
Eles correm em paralelo; um pipe típico possui um buffer de 64 KB. Nada para se preocupar :-) unix.stackexchange.com/questions/11946/… para obter detalhes sobre o tamanho do tubo.
Stephen Harris
cpiopode ser usado da mesma maneira.
Toby Speight
Se você possui o GNU tar, pode salvar o subshell usando seu -Cargumento para alterar o diretório (ou seja tar cf - ruby-2.1.3 | sudo tar -C /opt xpf -). Vale a pena mencionar que você deseja garantir que sudonão solicite sua senha (por exemplo, através de uma sudoersentrada ou credenciais em cache).
Toby Speight
6

Você pode usar rsyncou scpcopiar user@localhostpara o diretório local.

Exemplo para rsync:

# rsync "$real_user@localhost:$PWD/.rubies/ruby-2.1.3" /opt

Você pode alternativamente

$ rsync .rubies/ruby-2.1.3 "root@localhost:/opt"

se você permitir que o root acesse diretamente o host local (não recomendado; normalmente preferimos que o acesso seja via sudo).

Toby Speight
fonte
-4

Você pode fazer uma segunda entrada no FAT (ou o que for).
Eu faço isso para o meu HOSTSarquivo. Eu tenho um link em um diretório gravável que se refere ao arquivo e ele tem permissões diferentes; portanto, /Hosts/HOSTSeu posso modificá-lo facilmente e as alterações são colocadas nos dois arquivos (ou seja, "o único"). São 2 entradas para 1 arquivo. Não me lembro do comando, desculpe.

Para você, você cria um link /optpara todos os arquivos inseridos .rubiese, quando altera alguma coisa /opt, é o mesmo arquivo inserido em .rubies.

Engenheiro
fonte
4
Isso é falso e enganoso, além de não responder à pergunta.
Curinga
É apenas falso, porque estamos lidando com um sistema de arquivos diferente. O respondente estava obviamente se referindo a links físicos que funcionam como mencionado, embora não sejam aplicáveis ​​a esta pergunta.
Julie Pelletier
Obrigado, Wildcard, eu tinha uma linha na minha resposta sobre obter um monte de flack, mas foi editada quando Michael o aprimorou. : p
Engineer