Как скопировать каталог, к которому root не может получить доступ, в каталог, к которому имеет доступ только root?

11

У меня есть каталог на монтирование NFS, которое на сервере находится в /home/myname/.rubies

Root не может получить доступ к этому каталогу:

[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

Я пытаюсь скопировать что-то из этого каталога, к /optкоторому только root имеет доступ:

[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

Очевидно, что я могу сделать следующее (и это то, что я сделал в настоящее время):

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

Есть ли способ сделать это, который не будет включать копирование в качестве промежуточного шага или изменение разрешений?

Митч
источник
cp -Rp /home/mitchell.usher/.rubies /tmp/templocation; sudo mv /tmp/templocation/ruby-2.1.3 /optэто не сработает? Если нет, почему?
MelBurslan
@MelBurslan это то, что я сделал, как указано в вопросе. Но допустим, что это файл размером 50 ГБ, который больше никуда не помещается в файловой системе, тогда я не смог быcp <file> /tmp/tmpfile
Митч

Ответы:

29

Вы можете использовать tarкак буферный процесс

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

Первый tarзапускается как вы и так можете прочитать ваш домашний каталог; вторая tarработает под sudoи поэтому может писать в /opt.

Стивен Харрис
источник
1
Как это в памяти? Если у меня есть файл размером 10 ГБ, будет ли он заполнять 10 ГБ памяти до того, как он будет передан по каналу и не сконцентрирован, или он будет распакован как тар?
Митч
5
Они работают параллельно; типичный канал имеет буфер 64 Кбайт. Не о чем беспокоиться :-) unix.stackexchange.com/questions/11946/… для получения информации о размере трубы.
Стивен Харрис
cpioможно использовать во многом таким же образом.
Тоби Спейт
Если у вас есть GNU tar, вы можете сохранить подоболочку, используя ее -Cаргумент для изменения каталога (т.е. tar cf - ruby-2.1.3 | sudo tar -C /opt xpf -). Стоит упомянуть, что вы хотите убедиться, что sudoне будут спрашивать ваш пароль (например, через sudoersзапись или кэшированные учетные данные).
Тоби Спейт
6

Вы можете использовать rsyncили scpдля копирования user@localhostв локальный каталог.

Пример для rsync:

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

Вы могли бы альтернативно

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

если вы разрешите root доступ напрямую к localhost (не рекомендуется; обычно мы предпочитаем доступ через root sudo).

Тоби Спейт
источник
-4

Вы можете сделать вторую запись в FAT (или как угодно).
Я делаю это для моего HOSTSфайла. У меня есть ссылка в доступном для записи каталоге, которая ссылается на файл, и у него есть другие права доступа, поэтому я /Hosts/HOSTSмогу легко изменять, и изменения помещаются в оба (т. Е. "Один") файла (ов). Это 2 записи для 1 файла. Я не помню команду, извините.

Для вас вы делаете ссылку /optна все файлы в .rubies, а когда вы что-либо изменяете /opt, это тот же файл, что и в .rubies.

инженер
источник
4
Это ложно и вводит в заблуждение, кроме того, что не отвечает на вопрос.
Wildcard
Это только ложь, потому что мы имеем дело с другой файловой системой. Ответчик, очевидно, имел в виду жесткие ссылки, которые работают, как указано, хотя и не относятся к этому вопросу.
Джули Пеллетье
Благодаря Wildcard, в моем ответе была строчка о том, чтобы получить кучу неудач, но это было отредактировано, когда Майкл улучшил это. : p
Инженер