• 更改文件拥有者


    更改文件拥有者

    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

    1. /**
    2. * 文件名称: mychown.c
    3. * 作者: firewaywei
    4. * 时间: 2016年 10月 23日 星期日 10:59:24 CST
    5. */
    6. #include<unistd.h>
    7. int main()
    8. {
    9. if(chown("1",1,-1)==-1)
    10. {
    11. perror("chown error:");
    12. return-1;
    13. }
    14. return0;
    15. }
    代码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个函数的操作类似。
        lchownfchownat(flag设置了AT_SYMLINK_NOFOLLOW标志)更改符号链接本身的所有者,而不是该符号链接所指向的文件的所有者。
        fchown函数改变fd参数指向的打开文件的所有者,既然它在一个已打开的文件上操作,就不能用于改变符号链接的所有者。
        fchownat函数与chown或者lchown函数在下面两种情况是相同的:
    1. pathname参数是绝对路径,另一种fd参数取值为AT_FDCWD
    2. pathname参数为相对路径
        在这两种情况下,如果flag参数中设置了AT_SYMLINK_NOFOLLOW标志,fchownatlchown行为相同
        如果flag参数中清除了AT_SYMLINK_NOFOLLOW标志,则fchownatchown行为相同。
        fchownat函数如果fd参数设置为打开目录的文件描述符,并且pathname参数是一个相对路径,则该函数计算相对于打开目录的pathname

    _POSIX_CHOWN_RESTRICTED的值

        _POSIX_CHOWN_RESTRICTED常量可选地定义在头文件<unistd.h>,而且总是可以使用pathconffpathconf函数进行查询。
    Name of option Indicates ... name argument
    _POSIX_CHOWN_RESTRICTED whether use of chown is restricted _PC_CHOWN_RESTRICTED
    1. /**
    2. * 文件名: chown_restricted.c
    3. * 文件内容:打印Linux平台_POSIX_CHOWN_RESTRICTED的值
    4. * 作者:firewaywei
    5. * 时间: 2016年 10月 23日 星期日 15:38:01 CST
    6. */
    7. #include<unistd.h>
    8. #include<stdio.h>
    9. #include<errno.h>
    10. #include<string.h>
    11. staticvoid pr_pathconf(char*mesg,char*path,int name);
    12. int main(int argc,char*argv[])
    13. {
    14. if(argc !=2)
    15. {
    16. printf("usage: a.out <dirname>");
    17. }
    18. #ifdef _POSIX_CHOWN_RESTRICTED
    19. printf("_POSIX_CHOWN_RESTRICTED is defined (val is %ld) ",(long)(_POSIX_CHOWN_RESTRICTED +0));
    20. #else
    21. printf("_POSIX_CHOWN_RESTRICTED is undefined ");
    22. #endif
    23. #ifdef _PC_CHOWN_RESTRICTED
    24. pr_pathconf("pathconf says _PC_CHOWN_RESTRICTED =", argv[1], _PC_CHOWN_RESTRICTED);
    25. #else
    26. printf("no symbol for _PC_CHOWN_RESTRICTED ");
    27. #endif
    28. // 打印用户ID和组ID
    29. printf("uid = %d, gid = %d ", getuid(), getgid());
    30. if(-1== chown(argv[1],-1,24))
    31. {
    32. perror("chown error:");
    33. }
    34. return0;
    35. }
    36. staticvoid pr_pathconf(char*mesg,char*path,int name)
    37. {
    38. fputs(mesg, stdout);
    39. errno =0;
    40. long val =0;
    41. if((val = pathconf(path, name))<0)
    42. {
    43. if(errno !=0)
    44. {
    45. if(EINVAL == errno)
    46. {
    47. fputs(" (not supported) ", stdout);
    48. }
    49. else
    50. {
    51. char*err = strerror(errno);
    52. printf("pathconf error, path = %s : %s ", path, err);
    53. }
    54. }
    55. else
    56. {
    57. fputs(" (no limit) ", stdout);
    58. }
    59. }
    60. else
    61. {
    62. printf(" %ld ", val);
    63. }
    64. }
    代码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对指定的文件生效,则
    1. 只有超级用户进程能更改该文件的用户ID
    2. 如果进程拥有此文件(其有效用户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
     
  • 相关阅读:
    主函数main
    static关键字
    this关键字
    构造函数
    封装
    匿名对象
    java基础积累
    JAVA相关知识复习
    ORACLE数据库表空间查询
    两个日期的时间差
  • 原文地址:https://www.cnblogs.com/fireway/p/6014282.html
Copyright © 2020-2023  润新知