操作系统中的不同用户拥有所有权和权限,以确保文件的安全并限制谁可以修改文件的内容。在 Linux 中,chown 命令用于更改系统中另一个用户对文件或目录的所有权。

什么是 chown 命令?

chown(更改所有者的缩写)命令用于更改基于 Linux 的操作系统中文件和目录组的所有权。 它有助于使文件更安全,并对未经授权的用户施加限制。

在本文中,我们将学习在 Linux 中使用 chown 命令,但让我们首先讨论它的语法:

chown [options] user [:group] file…

chown 命令接受一个选项、一个用户和一个组名以及文件/目录的名称。 chown 会将文件/目录的所有权/组更改为指定的用户和组。

下面给出了与 chown 命令一起使用的一些最常用的选项:


如何在 Linux 中检查文件的所有权

首先,在使用 chown 命令进行所有权更改之前,您需要知道原始文件所有者或组。

要检查当前位置的 Linux 文件和目录的组或所有权,请运行以下命令:

ls -l

使用 chown 命令更改文件所有者

我们只需要将文件名和新所有者的用户名一起提供给 chown 命令,以更改 Linux 中文件的所有权:

chown

chown 命令的形成中,可以看到前半部分是用户名,后半部分是文件或文件夹路径。

显示 UID、GID 和组

Linux 系统中,每个用户的 ID 细分为 2 种,分别是用户 ID(User ID,简称 UID)和组 ID(Group ID,简称 GID)。

我们可以在终端 shell 上执行id、groups 命令来显示用户 ID 和组 ID。最后通过使用这些组 ID 或组名称或所有者名称通过 Linux 中的 chown 命令将当前所有权更改为您想要的所有者。

id [OPTION]… [USERNAME]

groups [OPTION]… [USERNAME]…


更改文件的所有者(使用 UID)

如果你已经知道文件的 UID 或文件的组 ID,还可以通过 UID 在 Linux 系统上应用 chown 命令来更改所有权。

更改文件组

要更改组或文件的所有权,可以在 Linux 上使用下面提到的 chown 命令来设置所有者。

更改用户名和组名

chown 命令还允许我们更改 Linux 文件系统上的用户和组名。

chown <用户名/UID>:<组名/GID> <文件名>

在进行更改之前检查所有者和组

chown 命令 --from 选项允许您验证当前所有者和组,然后应用更改。检查用户和组的 chown 语法如下所示:

chown --from=CurrentUser:CurrentGroup NewUser:NewGroup FILE

下面的示例显示我们首先验证了文件 test.txt 的所有权和组:


仅检查组

与上面类似,可以使用选项 --from 仅验证文件的组。

chown --from=:CurrentGroup :NewGroup FILE

这是一个示例,我们在更改当前组之前对其进行了验证:

如何递归更改文件所有权

chown 命令允许更改指定目录中所有文件和子目录的所有权。 将 -R 选项添加到命令中以执行此操作:

chown -R NewUser:NewGroup DirNameOrPath

chown 命令和符号链接

要将更改推送到链接,请运行带有 -h 标志的 chown 命令:

chown -h NewUser:NewGroup SymbolicLink

显示chown命令进程详细信息

默认情况下,终端不显示chown进程信息。 要查看幕后发生的事情,请使用两个命令行标志之一:

即使所有权保持不变,选项 -v 也会生成流程详细信息。
选项 –c 仅在目标文件的所有者或组更改时显示输出信息。

例如,如果我们将当前所有者指定为文件的新所有者:

抑制 chown 命令错误

为避免在运行 chown 命令时看到潜在的错误消息,请使用 -f 选项:

chown 命令C/C++代码实现

int main(int argc, char **argv)
{

	Hflag = Lflag = Rflag = fflag = hflag = vflag = xflag = 0;
	while ((ch = getopt(argc, argv, "HLPRfhvx")) != -1)
		switch (ch) 
		{
			case 'H':
				Hflag = 1;
				Lflag = 0;
				break;
			case 'L':
				Lflag = 1;
				Hflag = 0;
				break;
			case 'P':
				Hflag = Lflag = 0;
				break;
			case 'R':
				Rflag = 1;
				break;
			case 'f':
				fflag = 1;
				break;
			case 'h':
				hflag = 1;
				break;
			case 'v':
				vflag++;
				break;
			case 'x':
				xflag = 1;
				break;
			default:
				usage();
		}
	argv += optind;
	argc -= optind;

	if (argc < 2)
		usage();

	if (Rflag) 
	{
		if (hflag && (Hflag || Lflag))
			errx(1, "the -R%c and -h options may not be "
			    "specified together", Hflag ? 'H' : 'L');
		if (Lflag) 
		{
			fts_options = FTS_LOGICAL;
		} 
		else 
		{
			fts_options = FTS_PHYSICAL;

			if (Hflag) 
			{
				fts_options |= FTS_COMFOLLOW;
			}
		}
	} 
	else if (hflag) 
	{
		fts_options = FTS_PHYSICAL;
	} 
	else 
	{
		fts_options = FTS_LOGICAL;
	}

	if (xflag)
		fts_options |= FTS_XDEV;

	uid = (uid_t)-1;
	gid = (gid_t)-1;
	if (ischown) 
	{
		if ((cp = strchr(*argv, ':')) != NULL) 
		{
			*cp++ = '\0';
			a_gid(cp);
		}
		a_uid(*argv);
	} 
	else
		a_gid(*argv);

	if ((ftsp = fts_open(++argv, fts_options, NULL)) == NULL)
		err(1, NULL);

	for (rval = 0; (p = fts_read(ftsp)) != NULL;) 
	{
       ...

	}
    ...
}
...

运行结果:

总结

在每个 Linux 操作系统中,每个文件都与一个组的所有者相关联。 如果不是创建或修改文件的特定所有者,则不能从其他用户帐户更改或修改该文件。 但是在 chown 命令的帮助下,可以轻松访问要修改的目录或文件。

欢迎关注微信公众号【程序猿编码】,需要chown命令完整源码的添加本人微信号(c17865354792)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐