在Linux系统中,一切皆为文件,这意味着所有输入/输出资源,例如文件、目录、磁盘驱动器、打印机等,都通过文件系统命名为公开文件。除此之外,Linux 中的每个文件都有所有权。
文件所有权由两个实体表示——用户和组。访问权限和所有权的结合允许Linux用户以有效的方式实现访问控制机制。
在本指南中,小编将简单介绍下chown命令,该命令用于更改文件的所有权。了解本文内容之后,Linux初学者将能够在系统中有效地使用chown命令。
chown命令语法
chown命令的语法如下:
$ chown [OPTION]... [OWNER][:[GROUP]] [FILE-1] [FILE-2]...[FILE-N]
接下来通过一些实际例子来简单介绍下chown命令的用法。
1、查找文件的归属
查找文件所有者的最简单方法是使用ls命令,它将列出文件的用户和组。
$ touch file-1.txt $ ls -l file-1.txt
在上面的输出中,可以看到该文件属于tecmint用户和组,分别在上图中的第三列和第四列显示。
2、更改文件的所有权
chown命令允许用户更改文件的所有权。这里通过将用户narendra设置为文件的所有者来查看它的用法:
$ sudo chown narendra file-1.txt
现在来验证文件的所有权是否已更改:
$ ls -l file-1.txt
3、更改文件的组所有权
与用户所有权类似,也可以使用chown命令更改文件的组所有权。这里将文件的组所有权设置为组 – narendra:
$ sudo chown :narendra file-1.txt
需要注意的是,在更改组所有权时,必须在组名中使用冒号(:)。
现在,验证文件的组所有权是否改变:
$ ls -l file-1.txt
4、更改文件的所有权和组
在前面的示例中,使用了两次chown命令。首先,更改用户所有权,然后更改组所有权。但是,可以使用单个命令同时更改用户和组。
接下来使用以下命令将文件所有权重置为用户和组tecmint:
$ sudo chown tecmint:tecmint file-1.txt
在此示例中,使用冒号(:)
字符分隔用户和组。冒号前的值代表用户,而冒号后的值代表组。
现在,可以检查更新后的文件所有权:
$ ls -l file-1.txt
5、更改符号链接的所有权
默认情况下,chown命令取消对符号链接的引用,这意味着,如果输入文件是符号链接,那么它会更改引用文件的所有权,而不是符号链接本身。但是,我们可以使用-h
选项覆盖默认行为,如以下示例所示。
首先,创建一个符号链接并验证它是否指向正确的参考文件:
$ ln -s file-1.txt symlink $ ls -l symlink
接下来,使用以下-h
选项更改符号链接的所有权:
$ sudo chown -h narendra:narendra symlink
最后,验证符号链接及其引用文件的所有权:
$ ls -l symlink file-1.txt
6、将文件所有权转移给用户
有时候,需要在验证文件的当前所有权后才更新文件的所有权。在这种情况下,可以使用chown命令的--from
选项,如下所示:
$ sudo chown -h --from narendra:narendra tecmint:tecmint symlink
在此示例中,--from
选项表示文件的当前所有者,而下一个参数表示新的所有权。因此,只有当文件由用户和组–narendra拥有时,上述命令才会更新文件–symlink的所有权。
现在来检查文件的更新所有权,命令如下:
$ ls -l symlink
在此示例中,使用冒号(:)
字符指定了用户和组。当然,也可以按照前面的示例中所讨论的那样指定它们中的任何一个。
7、从另一个文件复制所有权
有时候,从现有文件复制所有权比从命令行提供所有权更方便。在这种情况下,可以将--reference
选项与chown命令一起使用,它表示要从中复制所有权的文件。
首先,创建一个新文件并更改其所有权:
$ touch file-2.txt $ sudo chown narendra:narendra file-2.txt
现在,检查这两个文件的当前所有权:
$ ls -l file-1.txt file-2.txt
接下来,使用以下命令将file-2.txt文件的所有权设置为与file-1.txt相同:
$ sudo chown --reference=file-1.txt file-2.txt
最后,验证所有权是否已成功更新:
$ ls -l file-1.txt file-2.txt
在上面的输出中,可以看到现在这两个文件拥有相同的所有权。
8、递归地改变目录的所有权
其实也可以使用chown命令来更改目录的所有权。但是,该命令的默认行为是非递归的。这意味着chown命令只会更改输入目录的所有权。但是,我们可以使用以下示例中所示的-R
选项覆盖此默认行为。
首先,在其中创建一个目录和两个文件:
$ mkdir dir-1 $ touch dir-1/demo-1.txt dir-1/demo-2.txt
接下来,检查目录及其文件的所有权:
$ ls -ld dir-1 $ ls -l dir-1
然后,以递归方式更改目录及其文件的所有权:
$ sudo chown -R narendra:narendra dir-1
最后,验证目录及其文件的所有权:
$ ls -ld dir-1 $ ls -l dir-1
9、输出chown命令进程详细信息
默认情况下,更改所有权后chown命令不会在终端上输出任何内容。因此,到目前为止,一直在使用ls 命令的-l
选项来验证更新的所有权。
为了克服这个限制,可以启用输出每个已处理文件诊断信息的命令的详细模式。当将它与-R
选项一起使用时,此选项会提供有意义的信息。因此,现在使用命令的-v
选项来启用详细模式:
$ sudo chown -Rv tecmint:tecmint dir-1
现在,可以检查命令的输出:
10、抑制chown命令错误
与其他Linux 命令一样,chown也会在出现错误情况时提供有意义的信息。该错误可能由于多种原因而发生,例如不存在的文件、组或用户、执行某些操作的权限不足等。
然而,有时我们不想显示这些错误信息。在这种情况下,可以使用-f
命令的选项来抑制错误消息。为了更好地理解这一点,接下来尝试更改不存在文件的所有权:
$ sudo chown -f narendra:narendra non-existing-file.txt $ echo $? 1
现在,可以看看命令的输出:
如上所示,上面的命令没有显示任何错误。但是,该命令使用非零返回值来显示处理失败。
11、更改文件用户和组ID
到目前为止,已经使用用户名和组名来更改文件的所有权。但是,也可以使用用户ID和组ID来达到相同的结果。
首先,使用id命令查找narendra用户的用户和组ID:
$ id narendra
现在,在chown命令中使用用户和组ID 1001 :
$ ls -l file-1.txt $ sudo chown 1001:1001 file-1.txt
最后,验证所有权是否已成功更新:
$ ls -l file-1.txt
总结
在本文中,小编简单介绍了chown命令的一些实际示例。熟练这些使用这些示例可以有效提高使用Linux系统时的工作效率,所以务必要了解chown知识。
众所周知,在Linux系统中,文件所有权限是一项非常重要的内容,因为只有对该文件拥有所有权,才能对该文件执行一系列操作,否则可能会出现相应的错误。