在同一台机器上将文件从一个用户复制到另一个用户。

如何通过命令行将文件或目录从一个用户复制到另一个用户的同一台机器上?
假设在USER1的主目录中有一个名为test.txt的文件。我需要将该文件复制到我的机器上USER2的主目录中。我该如何通过命令行来实现?
9个回答

假设您拥有sudo特权,则以下命令将起作用。
sudo cp /home/USER1/FNAME /home/USER2/FNAME && sudo chown USER2:USER2 /home/USER2/FNAME

将文件从USER1复制到USER2,然后将副本在/home/USER2的所有者更改为USER2。
如果您没有sudo权限,则两个用户需要确保您对USER1目录具有读取权限,并对USER2目录具有写入访问权限。如果您具备这些权限,可以输入以下命令:
cp /home/USER1/FNAME /home/USER2/FNAME

这将复制所讨论的文件,但是USER2可能无法在获得适当权限之前操作该文件。

另一种选择是将权限设置在他们自己的文件夹上,以允许其他用户获取它们,但如果可能的话,这个选项要简单得多。 - Geary Shull
这样做会使用硬盘上两倍的空间吗? - caffeinemachine
@caffeinemachine 是的,因为你正在创建与问题中的文件重复的副本。假设第一个用户目录中的权限已经设置得使第二个用户对文件本身具有读取(和写入?)权限,那么你可以为第二个用户使用链接。手册页面(man ln)是学习链接的好起点。 - Charles Green
我遇到了这个错误:"cp:省略目录_______",哦,我刚意识到我在复制整个文件夹而不是一个文件,注意使用'sudo cp -r'和'chown -R'来递归地复制所有内容。 - flyingdrifter

作为USER1:

cp [filename] /tmp
chmod 777 /tmp/[filename]

作为USER2:
cp /tmp/[filename] .

作为USER1:

rm /tmp/[filename]

1你应该得到更多的赞赏 :) - Neeraj Jain

如果您没有sudo权限,另一种选择可能是使用scp与localhost:
scp file1 user2@localhost:/home/user2/

这假设:
- 您拥有两个用户的登录信息 - 主机上启用了SSH服务器 - 可以通过SSH登录

你为什么认为这与远程主机有关,或者说在相关的机器上运行着SSH/SFTP服务器? - David Foerster
1假设您已经安装了SSH - loudstil

假设您要么没有安装ssh,要么不想共享密钥/密码。
假设user1在group1中,user2在group2中,并且user1 != user2以及group1 != group2。
创建一个共享组,group3s。
addgrp group3

将user1和user2都添加到group3s组中。
在一个双方都可以访问的地方创建一个目录,其中一个用户拥有该目录,但是group3s组也具有所有权。
#as user1,
mkdir $place/shared && chown user1.group3s $place/shared && chmod 770 $place/shared;
#as user1 or user2,
cp $file $place/shared && chgrp $place/shared/$file && chmod 660 $place/shared/$file

但是,假设您无法创建新的共享组,并将两个用户放入该组呢?
创建目录并赋予它770权限。
mkdir $place/shared && chown user1.group1 $place/shared && chmod 770 $place/shared;

然后,以root/admin身份将组所有权更改为另一个用户的组。
sudo bash
chgrp group2 $place/shared && chmod g+s $place/shared

命令 chmod g+s 设置 setgid 位,以便将放置在该目录中的文件的组所有权设置为 group2。


使用以下命令来复制文件
sudo cp /home/USER1/test.txt /home/USER2/test.txt 
sudo chown USER2:USER2 /home/USER2/test.txt 

使用以下命令来复制目录
sudo cp -r /home/USER1/directory1 /home/USER2/directory1 
sudo chown -R USER2:USER2 /home/USER2/directory1 

每个其他答案都需要root访问权限,允许同一台机器上的任何用户复制文件,或者需要共享密码。这里有一种不需要这些的方法:
让USER2(我们称之为Bob)运行以下命令(您可以将/tmp替换为两个用户都具有写入权限的任何目录,但是/tmp是理想的选择,因为默认情况下它是粘性的,可以防止恶意用户破坏此过程。Bob拥有并且全局可读的目录也可以使用):
[bob@computer ~]$ touch /tmp/test.txt
[bob@computer ~]$ chmod 622 /tmp/test.txt

这将创建一个可写但不可读的文件。
然后让USER1(我们称她为Alice)运行以下命令(如果你很谨慎,Alice可以先检查权限以确保文件归Bob所有):
[alice@computer ~]$ dd if="$HOME/test.txt" of=/tmp/test.txt

这将覆盖/tmp/test.txt的内容。如果您想检查文件的完整性,Alice还应该生成文件的哈希值。例如:

[alice@computer ~]$ openssl sha1 < "$HOME/test.txt" > /tmp/test.txt.sha1

你可以选择对文件进行数字签名,或者采用其他任何保证其完整性的方法。
最后,Bob移动了文件并拥有了它。
[bob@computer ~]$ mv /tmp/test.txt "$HOME" 
[bob@computer ~]$ chmod 600 "$HOME/test.txt"

Bob可以检查完整性,如果他愿意的话。如果是这样,他应该检查确保只有Alice可以写入/tmp/test.txt。
[bob@computer ~]$ diff /tmp/test/txt.sha1 <(openssl sha1 < "$HOME/test.txt")

如果文件被正确复制,这应该不会显示任何输出。

把文件放在一个子目录下,所有用户都有读取和执行权限是关键。
在$HOME目录下是无法成功的,因为它的文件模式是700。
mkdir -m 755 share              # 755 might be default with umask
cd share                        # you have to cd
touch file
sudo -u user2 cp file ~user2/

尝试安装;
man install -o, --owner=OWNER -g, --group=GROUP
install -C -o ldap -g ldap /etc/letsencrypt/live/privkey.pem /etc/openldap/certs/tls/ldap_server.key

1这个回答似乎与问题无关。 - David
不需要复制文件并使用chown授权,我选择共享它,因为这样可以通过一个命令完成工作。 - mertyak0n

在将一个用户复制到另一个用户之前,您需要以su用户身份登录,然后使用cp命令。
sudo cp /home/shyam/Desktop/sparkhadoop_2.11-1.0.jar /home/hadoop/Desktop

这不会将所有权转移给USER2,而是保留为root。-1 - David Foerster
@DavidFoerster 我们并不是转移所有权,而是将文件从一个用户复制到另一个用户。使用根用户,我们可以进行文件传输。好的。 - Shyam Gupta