¿Cómo copiar un directorio al que la raíz no puede acceder a un directorio al que solo la raíz puede acceder?

11

Tengo un directorio en un montaje nfs, que en el servidor está en /home/myname/.rubies

Root no puede acceder a este directorio:

[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

Estoy intentando copiar algo desde ese directorio al /optque solo la raíz tiene acceso:

[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 puedo hacer lo siguiente (y es lo que he hecho por el momento):

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

¿Hay alguna manera de hacer esto que no implique copiarlo como un paso intermedio o cambiar los permisos?

Mitch
fuente
cp -Rp /home/mitchell.usher/.rubies /tmp/templocation; sudo mv /tmp/templocation/ruby-2.1.3 /opt¿esto no funcionará? Si no, ¿por qué?
MelBurslan
@MelBurslan, eso es lo que hice, como se indica en la pregunta. Pero digamos que es un archivo de 50 GB que no cabe en ningún otro lugar del sistema de archivos, entonces no podría hacerlocp <file> /tmp/tmpfile
Mitch

Respuestas:

29

Puedes usarlo tarcomo un proceso de buffer

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

El primero se tarejecuta como usted y así puede leer su directorio de inicio; el segundo se tarejecuta debajo sudoy así puede escribir /opt.

Stephen Harris
fuente
1
¿Cómo es esto en la memoria? Si tengo un archivo de 10 GB, ¿eso va a llenar 10 GB de memoria antes de que se canalice y elimine el contenido de alquitrán, o lo hará?
Mitch
55
Corren en paralelo; una tubería típica tiene un búfer de 64 KB. No hay nada de qué preocuparse :-) unix.stackexchange.com/questions/11946/… para obtener detalles sobre el tamaño de la tubería.
Stephen Harris
Consulte también ¿En qué orden se ejecutan los comandos canalizados? (en particular, mi respuesta ).
Scott
cpiose puede usar de la misma manera.
Toby Speight el
Si tiene GNU tar, puede guardar la subshell utilizando su -Cargumento para cambiar el directorio (es decir tar cf - ruby-2.1.3 | sudo tar -C /opt xpf -). Vale la pena mencionar que desea asegurarse de que sudono le pedirá su contraseña (por ejemplo, a través de una sudoersentrada o credenciales en caché).
Toby Speight
6

Puede usar rsynco scpcopiar desde user@localhostel directorio local.

Ejemplo para rsync:

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

Alternativamente podrías

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

si deja que el acceso raíz localhost directamente (no se recomienda; normalmente preferimos que el acceso raíz sea a través de sudo).

Toby Speight
fuente
-4

Puede hacer una segunda entrada en el FAT (o lo que sea).
Hago esto para mi HOSTSarchivo. Tengo un enlace en un directorio de escritura que hace referencia al archivo y tiene diferentes permisos, por lo que tengo /Hosts/HOSTSque puedo modificar fácilmente, y los cambios se colocan en ambos archivos (es decir, "uno"). Son 2 entradas para 1 archivo. No recuerdo el comando, lo siento.

Para usted, crea un enlace /optpara todos los archivos .rubiesy, cuando cambia algo /opt, es el mismo archivo que en .rubies.

Ingeniero
fuente
44
Esto es falso y engañoso, además de no responder la pregunta.
Comodín el
Solo es falso porque estamos tratando con un sistema de archivos diferente. El contestador obviamente se refería a los enlaces duros que funcionan como se mencionó, aunque no es aplicable para esta pregunta.
Julie Pelletier
Gracias comodín, tenía una línea en mi respuesta sobre conseguir un montón de flack pero fue editado cuando Michael lo mejoró. : p
Ingeniero