免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1006 | 回复: 1
打印 上一主题 下一主题

apue 学习之 Chapter 4 - chown [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-04 21:31 |只看该作者 |倒序浏览

apue 学习之 Chapter 4 - chown








4.11. chown,fchown, and lchown Functions

在做实验之前,因为操作vim和bash环境设置的问题搞了好长时间,总算勉勉强强顺手了。不过vim操作和bash脚本编程,.vimrc和.bashrc编写确实要抽时间来熟悉一下。



本例的初衷是为了理解上面那几个函数,不过我想功能应该是差不多的,于是就只选取了chown来做实验。

实验代码如下:




view plaincopy to clipboard
  1. 01.#include <stdio.h>  
  2. 02.#include <unistd.h>  
  3. 03.#include "apue.h"  
  4. 04.#include "myerr.c"  
  5. 05.#include <pwd.h>  
  6. 06.  
  7. 07.#ifdef _POSIX_CHOWN_RESTRICTED  
  8. 08.#undef _POSIX_CHOWN_RESTRICTED  
  9. 09.#endif  
  10. 10.#define _POSIX_CHOWN_RESTRICTED 0  
  11. 11.  
  12. 12.int  
  13. 13.main (int argc, char *argv[])  
  14. 14.{  
  15. 15.    uid_t   uid ;  
  16. 16.    struct passwd   *pwdp ;  
  17. 17.    int     i, j ;  
  18. 18.    char    *endptr ;  
  19. 19.    char    bSuccess ;  
  20. 20.      
  21. 21.    if (argc != 3)  
  22. 22.        err_quit ("usage : a.out <attribute> <filename> ...\n") ;  
  23. 23.  
  24. 24.    printf ("current user id :\t\t %d\n", getuid ()) ;  
  25. 25.    printf ("current group id :\t\t %d\n", getgid ()) ;  
  26. 26.    printf ("current effective user id :\t %d\n", geteuid ()) ;  
  27. 27.    printf ("current effective ground id :\t %d\n", getegid ()) ;  
  28. 28.  
  29. 29.    uid = strtol (argv[1], &endptr, 0) ;  
  30. 30.    if (*endptr != '\0') {      // user name  
  31. 31.        if ((pwdp = getpwnam (argv[1])) == NULL)  
  32. 32.            err_msg ("getpwnam error : ") ;  
  33. 33.    } else {  
  34. 34.        if ((pwdp = getpwuid (uid)) == NULL)  
  35. 35.            err_msg ("getpwuid error : ") ;  
  36. 36.    }  
  37. 37.  
  38. 38.    puts ("\nuser/group info by getpwnam/getpwuid function:") ;  
  39. 39.    printf ("user : %s\n", pwdp->pw_name) ;  
  40. 40.    printf ("pwd  : %s\n", pwdp->pw_passwd) ;  
  41. 41.    printf ("uid  : %d\n", pwdp->pw_uid) ;  
  42. 42.    printf ("gid  : %d\n", pwdp->pw_gid) ;  
  43. 43.    printf ("uifo : %s\n", pwdp->pw_gecos) ;  
  44. 44.    printf ("home : %s\n", pwdp->pw_dir) ;  
  45. 45.    printf ("shell: %s\n", pwdp->pw_shell) ;  
  46. 46.    printf ("-------\n") ;  
  47. 47.  
  48. 48.    printf ("_POSIX_CHOWN_RESTRICTED : %ld\n",   
  49. 49.        pathconf (argv[2], _PC_CHOWN_RESTRICTED)) ;  
  50. 50.  
  51. 51.    if (chown (argv[2], pwdp->pw_uid, -1) == -1)   
  52. 52.        err_ret ("chown for uid  error ") ;  
  53. 53.    else  
  54. 54.        printf ("success to change uid") ;  
  55. 55.      
  56. 56.    putchar ('\n') ;  
  57. 57.  
  58. 58.    if (chown (argv[2], -1, pwdp->pw_gid) == -1)  
  59. 59.        err_ret ("chown for gid  error ") ;  
  60. 60.    else  
  61. 61.        printf ("success to change gid") ;  
  62. 62.  
  63. 63.    putchar ('\n') ;  
  64. 64.  
  65. 65.    exit (0) ;  
  66. 66.}  
复制代码
此代码类似于bash的chown命令。从控制台接收三个参数,第一个是程序名,第二个是新的用户名或群组名,第三个是文件名。

第一部分,先输出当前用户的信息(uid,gid,euid,egid);

第二部分,输出新的用户名或群组名的信息,与/etc/passwd保持一致;

第三部分,输出_POSIX_CHOWN_RESTRICTED的值,看系统是否对chown的功能进行了限制;

第四部分,输出是否能改变文件的uid和gid。



实验结果表明,Fedora中对chown的功能是有限制的_POSIX_CHOWN_RESTRICTED被定义为1.

对于非特权用户,只能改变自己文件的所属group,不能改变文件所属者,但可以将自己的文件改变为自己……(听起来很那个= =!)

论坛徽章:
0
2 [报告]
发表于 2012-01-04 21:32 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP