更改文件拥有者
chown命令
chown将指定文件的拥有者改为指定的用户或组
命令格式如下:
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
普通用户不能将自己的文件改变成其他的拥有者。其操作权限一般为管理员
参数说明:
- -c 显示更改的部分的信息
- -f 忽略错误信息
- -h 修复符号链接
- -R 处理指定目录以及其子目录下的所有文件
- -v 显示详细的处理信息
- -deference 作用于符号链接的指向,而不是链接文件本身
- --reference=<目录或文件> 把指定的目录/文件作为参考,把操作的文件/目录设置成参考文件/目录相同拥有者和群组
- --from=<当前用户:当前群组> 只有当前用户和群组跟指定的用户和群组相同时才进行改变
- --help 显示帮助信息
- --version 显示版本信息
实例
命令如下:
chown mail:mail Checkers.class
$ ls -l Checkers.class
-rw-rw-r-- 1 fireway fireway 738 5月 4 07:16 Checkers.class
$ chown mail:mail Checkers.class
chown: 正在更改"Checkers.class" 的所有者: 不允许的操作
切换到高级管理员
# chown mail:mail Checkers.class
# ls -l Checkers.class
-rw-rw-r-- 1 mail mail 738 5月 4 07:16 Checkers.class
实例
命令如下:
chown root: FrequencyAnalysis.java
# ls -l FrequencyAnalysis.java
-rwxrwxrwx 1 fireway fireway 5044 9月 21 08:26 FrequencyAnalysis.java
# chown root: FrequencyAnalysis.java
# ls -l FrequencyAnalysis.java
-rwxrwxrwx 1 root root 5044 9月 21 08:26 FrequencyAnalysis.java
实例
命令如下:
chown :mail Test.class
# ls -l Test.class
-rw-rw-r-- 1 fireway fireway 995 9月 20 18:56 Test.class
# chown :mail Test.class
# ls -l Test.class
-rw-rw-r-- 1 fireway mail 995 9月 20 18:56 Test.class
id命令
id 命令可以显示真实有效的用户 ID(UID) 和组 ID(GID)。UID 是对一个用户的单一身份标识。组 ID(GID)则对应多个UID。
实例
$ id -a
uid=1000(fireway) gid=1000(fireway) 组=1000(fireway),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
实例
$ id -G
1000 4 24 27 30 46 108 124
结果只会显示 GID 号。你可以和 /etc/group 文件比较
实例
$ id -g
1000
实例
输出特定用户信息, 只需要在 id 命令后跟上用户名。
$ id fireway
uid=1000(fireway) gid=1000(fireway) 组=1000(fireway),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
函数chown、fchown、fchownat和lchown
/**
* 文件名称: mychown.c
* 作者: firewaywei
* 时间: 2016年 10月 23日 星期日 10:59:24 CST
*/
#include <unistd.h>
int main()
{
if (chown("1", 1, -1) == -1)
{
perror("chown error:");
return -1;
}
return 0;
}
代码1. chown更改一个文件的用户ID
运行该程序,其结果是:
$ touch 1
$ ll 1
-rw-rw-r-- 1 fireway fireway 0 10月 23 11:01 1
$ su
密码:
# ll 1
-rw-rw-r-- 1 fireway fireway 0 10月 23 11:01 1
# ./a.out
# ll 1
-rw-rw-r-- 1 daemon fireway 0 10月 23 11:01 1
# id daemon
uid=1(daemon) gid=1(daemon) 组=1(daemon)
下面几个chown函数是函数原型。如果两个参数owner或group中的任意一个是-1,则对应的ID不变。
#include <unistd.h>
int chown(const char *pathname, uid_t owner, gid_t group); int fchown(int fd, uid_t owner, gid_t group); int fchownat(int fd, const char *pathname, uid_t owner, gid_t group, int flag); int lchown(const char *pathname, uid_t owner, gid_t group); All four return: 0 if OK, ?1 on error |
除了所引用的文件是符号链接以外,这4个函数的操作类似。
lchown和fchownat(flag设置了AT_SYMLINK_NOFOLLOW标志)更改符号链接本身的所有者,而不是该符号链接所指向的文件的所有者。
fchown函数改变fd参数指向的打开文件的所有者,既然它在一个已打开的文件上操作,就不能用于改变符号链接的所有者。
fchownat函数与chown或者lchown函数在下面两种情况是相同的:
- pathname参数是绝对路径,另一种fd参数取值为AT_FDCWD
- pathname参数为相对路径
在这两种情况下,如果flag参数中设置了AT_SYMLINK_NOFOLLOW标志,fchownat与lchown行为相同
如果flag参数中清除了AT_SYMLINK_NOFOLLOW标志,则fchownat与chown行为相同。
fchownat函数如果fd参数设置为打开目录的文件描述符,并且pathname参数是一个相对路径,则该函数计算相对于打开目录的pathname。
_POSIX_CHOWN_RESTRICTED的值
_POSIX_CHOWN_RESTRICTED常量可选地定义在头文件<unistd.h>,而且总是可以使用pathconf或fpathconf函数进行查询。
Name of option | Indicates ... | name argument |
_POSIX_CHOWN_RESTRICTED | whether use of chown is restricted | _PC_CHOWN_RESTRICTED |
/**
* 文件名: chown_restricted.c
* 文件内容:打印Linux平台_POSIX_CHOWN_RESTRICTED的值
* 作者:firewaywei
* 时间: 2016年 10月 23日 星期日 15:38:01 CST
*/
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
static void pr_pathconf(char *mesg, char *path, int name);
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("usage: a.out <dirname>");
}
#ifdef _POSIX_CHOWN_RESTRICTED
printf("_POSIX_CHOWN_RESTRICTED is defined (val is %ld)\n", (long)(_POSIX_CHOWN_RESTRICTED + 0));
#else
printf("_POSIX_CHOWN_RESTRICTED is undefined\n");
#endif
#ifdef _PC_CHOWN_RESTRICTED
pr_pathconf("pathconf says _PC_CHOWN_RESTRICTED =", argv[1], _PC_CHOWN_RESTRICTED);
#else
printf("no symbol for _PC_CHOWN_RESTRICTED\n");
#endif
// 打印用户ID和组ID
printf("uid = %d, gid = %d\n", getuid(), getgid());
if (-1 == chown(argv[1], -1, 24))
{
perror("chown error:");
}
return 0;
}
static void pr_pathconf(char *mesg, char *path, int name)
{
fputs(mesg, stdout);
errno = 0;
long val = 0;
if ((val = pathconf(path, name)) < 0)
{
if (errno != 0)
{
if (EINVAL == errno)
{
fputs(" (not supported)\n", stdout);
}
else
{
char *err = strerror(errno);
printf("pathconf error, path = %s : %s\n", path, err);
}
}
else
{
fputs(" (no limit)\n", stdout);
}
}
else
{
printf(" %ld\n", val);
}
}
代码2. 使用pathconfig或fpathconf函数查询_POSIX_CHOWN_RESTRICTED常量值
程序运行如下:
$ ./a.out 1
_POSIX_CHOWN_RESTRICTED is defined (val is 0)
pathconf says _PC_CHOWN_RESTRICTED = 1
uid = 1000, gid = 1000
$ ll 1
-rw-rw-r-- 1 fireway cdrom 0 10月 23 15:27 1
$ id -G
1000 4 24 27 30 46 108 124
若_POSIX_CHOWN_RESTRICTED对指定的文件生效,则
- 只有超级用户进程能更改该文件的用户ID
- 如果进程拥有此文件(其有效用户ID等于该文件的用户ID),参数owner等于-1或文件的用户ID,并且参数group等于进程的有效组ID或者进程的附属组ID之一,那么一个非超级用户进程可以更改该文件的组ID
这意味着,当_POSIX_CHOWN_RESTRICTED有效时,不能更改其他用户文件的用户ID。你可以更改你所拥有的文件的组ID,但只能改到你所属的组。
如果这些函数由非超级用户进程调用,则在成功返回时,该文件的设置用户ID位(set-user-ID bits)和设置组ID位(set-group-ID bits)都会被清除。
参考
每天一个linux命令(30): chown命令 http://www.cnblogs.com/peida/archive/2012/12/04/2800684.html
Linux id 命令 - 显示用户id和组id信息 http://www.linuxidc.com/Linux/2014-01/95778.htm
UNIX环境高级编程(第三版) 4.11 函数chown、fchown、fchownat和lchown