Jak skopiować katalog, do którego root nie ma dostępu, do katalogu, do którego dostęp ma tylko root?

11

Mam katalog na mount nfs, który jest na serwerze /home/myname/.rubies

Root nie może uzyskać dostępu do tego katalogu:

[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

Próbuję skopiować coś z tego katalogu, do /optktórego tylko root ma dostęp do:

[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

Oczywiście mogę wykonać następujące czynności (i na razie to zrobiłem):

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

Czy jest jakiś sposób na zrobienie tego, co nie wymagałoby skopiowania go jako kroku pośredniego lub zmiany uprawnień?

Mitch
źródło
cp -Rp /home/mitchell.usher/.rubies /tmp/templocation; sudo mv /tmp/templocation/ruby-2.1.3 /optczy to nie zadziała? Jeśli nie, dlaczego?
MelBurslan,
@MelBurslan właśnie to zrobiłem, jak stwierdzono w pytaniu. Ale powiedzmy, że jest to plik o pojemności 50 GB, który nie zmieści się nigdzie indziej w systemie plików, więc nie byłbym w staniecp <file> /tmp/tmpfile
Mitch

Odpowiedzi:

29

Możesz użyć tarjako proces buforowy

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

Pierwszy tardziała tak jak Ty i możesz czytać swój katalog domowy; drugi tardziała poniżej sudoi może pisać /opt.

Stephen Harris
źródło
1
Jak to na pamięci? Jeśli mam plik o pojemności 10 GB, czy to zapełni 10 GB pamięci przed potokowaniem i rozpakowywaniem, czy też rozpakuje się podczas parsowania?
Mitch
5
Działają równolegle; typowa rura ma bufor 64 KB. Nie ma się czym martwić :-) unix.stackexchange.com/questions/11946/... dla szczegółów wielkości rur.
Stephen Harris
cpiomoże być używany w podobny sposób.
Toby Speight
Jeśli masz GNU tar, możesz zapisać podpowłokę, używając jej -Cargumentu do zmiany katalogu (tj tar cf - ruby-2.1.3 | sudo tar -C /opt xpf -.). Warto wspomnieć, że chcesz się upewnić, że sudonie poprosi o twoje hasło (np. Poprzez sudoerswpis lub dane z pamięci podręcznej).
Toby Speight
6

Możesz użyć rsynclub, scpaby skopiować z user@localhostkatalogu lokalnego.

Przykład dla rsync:

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

Możesz alternatywnie

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

jeśli pozwolisz rootowi na bezpośredni dostęp do lokalnego hosta (niezalecane; zwykle wolimy dostęp do roota przez via sudo).

Toby Speight
źródło
-4

Możesz wprowadzić drugi wpis w FAT (lub cokolwiek innego).
Robię to dla mojego HOSTSpliku. Mam link do zapisywalnego katalogu, który odnosi się do pliku i ma on różne uprawnienia, więc mogę /Hosts/HOSTSgo łatwo modyfikować, a zmiany są umieszczane w obu plikach (tj. „Jednym”). To 2 wpisy dla 1 pliku. Przepraszam, nie pamiętam polecenia.

Dla ciebie tworzysz link do /optwszystkich plików w .rubies, a kiedy cokolwiek zmienisz /opt, jest to ten sam plik co w .rubies.

Inżynier
źródło
4
Jest to fałszywe i mylące, poza tym, że nie odpowiada na pytanie.
Wildcard
To tylko fałsz, ponieważ mamy do czynienia z innym systemem plików. Odpowiadający oczywiście odnosił się do twardych linków, które działają jak wspomniano, choć nie dotyczą tego pytania.
Julie Pelletier
Dzięki Wildcard, w mojej odpowiedzi miałam linijkę o zdobyciu sporej ilości flacka, ale został on zredagowany, kiedy Michael go poprawił. : p
Inżynier