如何将无法访问根目录的目录复制到只能访问根目录的目录?


11

我在nfs挂载上有一个目录,该目录在服务器上位于 /home/myname/.rubies

根无法访问此目录:

[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,2016年

如问题中所述,@ MelBurslan就是我所做的。但是,假设它是一个50 GB的文件,无法容纳文件系统上的其他任何位置,那么我将无法做到cp <file> /tmp/tmpfile
Mitch

Answers:


29

您可以tar用作缓冲过程

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

第一个tar以您的身份运行,因此可以读取您的主目录。第二个tar在下面运行sudo,因此可以写/opt


1
记忆如何?如果我有一个10 GB的文件,该文件将在填充和解压缩之前填满10 GB的内存,还是在解压缩时解压缩?
米奇

5
它们并行运行;典型的管道具有64 KB的缓冲区。不用担心:-) unix.stackexchange.com/questions/11946/…有关管道尺寸的详细信息。
史蒂芬·哈里斯


cpio可以以几乎相同的方式使用。
Toby Speight,

如果您具有GNU tar,则可以通过使用其-C参数更改目录(即tar cf - ruby-2.1.3 | sudo tar -C /opt xpf -)来保存子shell 。可能值得一提的是,您要确保sudo不会询问您的密码(例如,通过sudoers输入或缓存的凭据)。
Toby Speight

6

您可以使用rsyncscp复制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访问root sudo)。


-4

您可以在FAT(或其他任何文件)中进行第二项输入。
我这样做是为了我的HOSTS文件。我在可写目录中有一个指向该文件的链接,并且该文件具有不同的权限,因此/Hosts/HOSTS我可以轻松进行修改,并将更改放入两个(即“一个”)文件中。1个文件的2个条目。我不记得命令了,抱歉。

对于您来说,您/opt将为中的所有文件创建一个链接.rubies,并且当您更改其中的任何内容时/opt,它与中的文件相同.rubies


4
除了不回答问题之外,这是错误和误导的。
通配符

这只是错误的,因为我们正在处理其他文件系统。回答者显然是指确实起作用的硬链接,尽管不适用于此问题。
朱莉·佩勒捷

谢谢Wildcard,我的回答中有一行关于出现一堆斑点的信息,但是当Michael改进它时,它就被删除了。:p
工程师
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.