设想:在计算机 A 下创建的文件(用户A),将文件所有权视为用户A然后转移到计算机 B,由另一个用户使用(用户B)....
Does the ownership of the original file change from the original user (userA) in computer A to the user (userB) of computer B?
How can I create a file that is only writable by me, the creator and owner, and only readable to anyone who might receive that file on other computers?
我在计算机 A 上创建了一个文件权限为 755 的 testfile.txt (用户A) 来比较使用 scp 将文件从计算机 A 传输到计算机 B 之前和之后的权限和所有权。我注意到我的原始文件现在在计算机 B 上,其用户 ID 为用户B代替用户A[文件创建的位置]。
计算机 A,具有“用户 A”
rwx-rxr——用户A测试文件.txt
计算机 B,有“用户 B”
rwx-rxr——用户B测试文件.txt
我认为并且希望使该文件只有所有者(我认为是我在其中创建该文件的计算机的用户)可读、可写和可执行。
谢谢!我是新手!
答案1
是的。
这完全取决于谁在目标上创建了文件。试试这个:
$ touch some_file
$ ls -l some_file
-rw-r--r-- 1 userA userA 0 Apr 9 17:44 some_file
$ ls -ln some_file
-rw-r--r-- 1 501 501 0 Apr 9 17:44 some_file
所以在我的例子中,userA 的数字 uid 是 501。
现在传输它,以用户 B 的身份登录到远程系统:
$ scp some_file userB@computerB:
$ ssh userB@computerB ls -l some_file
-rw-r--r-- 1 userB users 0 Apr 9 17:50 some_file
$ ssh userB@computerB ls -l some_file
-rw-r--r-- 1 1743 20 0 Apr 9 17:50 some_file
正如您在此处看到的,用户 B 创建了该文件,并且用户 B 具有数字 uid 1743。还看到时间戳是如何变化的吗?
这是 scp 的默认行为。不过,您可以使用 scp 的“-p”选项保留属性。这只会保留时间戳和权限——更重要的是,不会保留所有权。这可能正是您想要的:
$ scp -p some_file userB@computerB:
$ ssh userB@computerB ls -l some_file
-rw-r--r-- 1 userB users 0 Apr 9 17:44 some_file
$ ssh userB@computerB ls -l some_file
-rw-r--r-- 1 1743 20 0 Apr 9 17:44 some_file
请注意,除了 scp 之外,还有许多不同的方法可以在远程计算机上创建文件 - NFS、FTP、WebDAV... 这些方法的行为方式不同,但同样可以预测。不过,我们不要太过分 - 您问的是 scp。
(OT 注意,您实际上创建了具有 754 个权限的文件!rwx=111=7、rx=101=5、r--=100=4 – 您看,r、w 和 x 是八进制字中的位,其中 r=4、w=2、x=1。这就是为什么您会看到与权限相关的八进制引用。感谢 ernie 的更正!)
答案2
将本地复制到远程时 scp 的一般形式是:
scp localfile username@remotehost:/some/remote/directory
在这种情况下,您告诉 scp 您想要以username
远程系统身份登录,并且这是写入操作将使用的用户名。在您的示例中,最有可能的是,您在将文件 scp 到计算机 B 时使用了 userB。
如果您要将远程文件复制到本地主机,例如:
scp username@remotehost:/some/remote/file /some/local/directory
在这种情况下,您以username
远程系统的身份登录,然后以运行 scp 命令的用户身份在本地写入。此示例将以您当前登录的用户身份将文件从远程主机复制到您正在运行的系统(因为写入将由当前登录的用户执行)。这不会影响远程主机上的任何内容,因为您只是从那里读取文件,并将其复制到本地主机。由于您能够读取远程文件,因此本地文件必须具有您的写入权限,因为您正在本地写入文件。
换句话说 - 文件的所有者通常与文件的编写者相匹配。因此,如果您以用户 A 身份登录并编写文件,则所有者将是用户 A。一个更简单的例子可能是这样的:
user@server:~$ ls -l /var/log/syslog
-rw-r----- 1 syslog adm 6615 Apr 9 17:09 /var/log/syslog
请注意,该文件归 syslog 所有,但 adm 组中的任何人都可以读取该文件,而该用户恰好属于该组。然后,如果我们将该文件复制到用户的主目录 (~/):
user@server:~$ cp /var/log/syslog ~/
user@server:~$ ls -l ./syslog
-rw-r----- 1 user user 6615 Apr 9 17:10 ./syslog
请注意,该文件的复制版本现在归所有user
。 scp
正在执行相同的操作,只是源或目标可能涉及以不同的用户身份登录到不同的系统。
请注意,权限是通过用户 ID(用户的数字表示)来跟踪的。您可以使用命令查看当前的 UID id
。一般来说,对于单个系统,由于帐户不共享(除非您使用 LDAP 或类似系统),因此 UID 不会在系统之间相同。我认为传统上,0 是 root,小于 1000 的 UID 保留给系统帐户(例如邮件、新闻、bin、守护进程等),普通用户从 1000 开始。据我所知,普通用户 UID 是按顺序分配的,因此如果您创建了三个帐户,它们可能是 1000、1001 和 1002。
回到你原来的问题:如何发送一个只读文件,你必须确保远程系统上的读取器没有与文件所有者相同的 UID。例如,如果你(用户 A)正在为用户 B 准备一个文件,你可以执行以下操作:
scp localfile userA@remotehost:/some/remote/directory
在这种情况下,文件的所有者最终将是用户 A(并且我们知道用户 A 存在于远程系统上,因为我们以该用户身份登录),而用户 B 没有写权限(假设文件最初为 755)。 编辑:您可能需要 -p 来保留权限?
当然,如果用户 B 具有 root 或 sudo 权限,那么无论您做什么,他们都能够使文件可写。
答案3
当您将文件从源传输到目标时,权限和所有权实际上都受传输参数的影响。正如 @ernie 所说,所有权取决于您如何传输文件。
权限取决于umask
文件的。
对于老式 FTP 服务器,umask 通常在 FTP 服务器配置中设置。对于 SFTP 服务器(通过 SSH 或 scp),你必须根据这个答案为 ssh 设置 PAM 插件由于服务器故障。