我试图了解 cp 命令在 unix 中的权限用法。
- 将文件复制到目录中需要什么权限
- 从目录中复制需要什么权限?
我假设第一个问题,目录需要执行权限来执行操作,文件需要读取权限来读取文件的二进制文件,然后输出文件需要写入权限。
对于第二个目录本身需要执行权限来执行复制操作,文件需要读取权限才能从文件中提取数据。
谁能告诉我我的逻辑是否有问题?
答案1
你需要:
- 源目录:执行和读取权限
- 源文件:读取权限。
- 目标目录:执行和写入权限。
- 目标文件:您不需要任何权限,因为在复制它之前它不会退出。或写入权限(如果文件存在)。
你需要:
- 源目录:执行和读取权限
- 源文件:读取权限。
- 目标目录:执行和写入权限。
- 目标文件:您不需要任何权限,因为在复制它之前它不会退出。或写入权限(如果文件存在)。
如您所见,这两个问题实际上是相同的。如果您想确定的话,您可以在几分钟内亲自测试一下。
答案2
首先,你应该明白没有执行权限的目录是没有用的。 如果您具有读取权限,则可以列出内容 - 但即使这样也会在没有执行权限的情况下引发错误,并且您将得到的只是其中文件的名称,没有关于它们的其他信息。
接下来,了解一下目录的执行权限允许您访问内容,而不管读取权限如何—但是,前提是您已经知道目录中文件的确切名称。如果没有读取权限,您将无法列出目录内容,但如果您知道文件名并且对文件本身具有正确的权限,则执行允许您获取目录中的文件。
接下来,了解一下目录的写权限允许您添加文件和删除文件,无论您对文件拥有什么权限。这意味着您甚至可以删除您无权读取的文件。
一个可能有用的类比是电话簿。目录就是一个目录。它不是一个文件夹。它就像一本电话簿,它告诉您的只是文件名和关联的“电话号码”(称为索引节点号)。目录的读取权限使您可以读取电话簿。执行权限允许您拨打电话簿中的号码。写入权限使您可以在电话簿中记下文件名和号码,也可以删除已存在的文件名和号码。请注意,如果您具有执行权限(拨打号码的能力)但没有读取权限(读取电话簿的能力),并且您知道文件名,则仍然可以拨打电话。 (这个类比稍微有点不成立,因为在这种情况下你不需要 inode 号,只需要文件名。)
而且,非常重要的是,请注意,这并没有说明您的电话通话有多成功,只是您可以制作电话。这就是我们进入文件权限的时候。如果您可以拨打电话,即您对目录具有执行权限(并且已经知道文件名或对目录具有读取权限),那么文件权限就开始变得重要。
如果您具有该文件的读取权限,接听电话的人将回答您的问题(提供他们所掌握的信息,即告诉您文件内容)。如果您有写权限,您可以更改他们的答案(更改文件内容)。如果您具有执行权限,则可以将文件作为程序运行...我对此没有类比。
请注意,您可以在没有目录写入权限的情况下更改文件内容,因为您没有更改目录(电话簿),而只是更改目录具有号码的文件。但是如果没有目录的写权限,则无法在目录中创建新文件,因为这涉及到将新的姓名和号码写入“电话簿”中。同样,如果您对目录有写入权限,并且电话里有一些混蛋,他不会回答您的问题,也不会接受您的指示(没有写入权限,没有文件的读取权限),您仍然可以从其中删除他的名字电话簿。
我自己想到了这个比喻;它在大多数方面都非常精确,这也是目录被称为“目录”的原因。希望它有助于理解目录权限和文件权限之间的关系。 (有一个重要的功能我没有介绍,称为目录上的“粘性位”,但您可以自己查找。)
答案3
您的用户必须以任何方式至少对目标目录具有写入和执行权限(即,如果您的用户是所有者,则至少具有 权限
300
,如果您的用户不是所有者但位于组中,则至少具有 权限,030
并且如果您的用户是不是所有者,也不在组中,至少有权限003
)您的用户必须以任何方式至少对源目录具有读取和执行权限(即,如果您的用户是所有者,则至少具有 权限
500
,如果您的用户不是所有者但位于组中,则至少具有 权限,050
并且如果您的用户是不是所有者,也不在组中,至少有权限005
)
需要具有写入权限(在第一种情况下)和读取权限(在第二种情况下)的原因是不言自明的;在这两种情况下都需要具有执行权限的原因是因为要写入/读取文件,必须能够访问该目录,只有当用户对目标/源目录具有执行权限时才允许访问该目录。