apue 学习之 Chapter 4 - chown
4.11. chown,fchown, and lchown Functions
在做实验之前,因为操作vim和bash环境设置的问题搞了好长时间,总算勉勉强强顺手了。不过vim操作和bash脚本编程,.vimrc和.bashrc编写确实要抽时间来熟悉一下。
本例的初衷是为了理解上面那几个函数,不过我想功能应该是差不多的,于是就只选取了chown来做实验。
实验代码如下:
view plaincopy to clipboard- 01.#include <stdio.h>
- 02.#include <unistd.h>
- 03.#include "apue.h"
- 04.#include "myerr.c"
- 05.#include <pwd.h>
- 06.
- 07.#ifdef _POSIX_CHOWN_RESTRICTED
- 08.#undef _POSIX_CHOWN_RESTRICTED
- 09.#endif
- 10.#define _POSIX_CHOWN_RESTRICTED 0
- 11.
- 12.int
- 13.main (int argc, char *argv[])
- 14.{
- 15. uid_t uid ;
- 16. struct passwd *pwdp ;
- 17. int i, j ;
- 18. char *endptr ;
- 19. char bSuccess ;
- 20.
- 21. if (argc != 3)
- 22. err_quit ("usage : a.out <attribute> <filename> ...\n") ;
- 23.
- 24. printf ("current user id :\t\t %d\n", getuid ()) ;
- 25. printf ("current group id :\t\t %d\n", getgid ()) ;
- 26. printf ("current effective user id :\t %d\n", geteuid ()) ;
- 27. printf ("current effective ground id :\t %d\n", getegid ()) ;
- 28.
- 29. uid = strtol (argv[1], &endptr, 0) ;
- 30. if (*endptr != '\0') { // user name
- 31. if ((pwdp = getpwnam (argv[1])) == NULL)
- 32. err_msg ("getpwnam error : ") ;
- 33. } else {
- 34. if ((pwdp = getpwuid (uid)) == NULL)
- 35. err_msg ("getpwuid error : ") ;
- 36. }
- 37.
- 38. puts ("\nuser/group info by getpwnam/getpwuid function:") ;
- 39. printf ("user : %s\n", pwdp->pw_name) ;
- 40. printf ("pwd : %s\n", pwdp->pw_passwd) ;
- 41. printf ("uid : %d\n", pwdp->pw_uid) ;
- 42. printf ("gid : %d\n", pwdp->pw_gid) ;
- 43. printf ("uifo : %s\n", pwdp->pw_gecos) ;
- 44. printf ("home : %s\n", pwdp->pw_dir) ;
- 45. printf ("shell: %s\n", pwdp->pw_shell) ;
- 46. printf ("-------\n") ;
- 47.
- 48. printf ("_POSIX_CHOWN_RESTRICTED : %ld\n",
- 49. pathconf (argv[2], _PC_CHOWN_RESTRICTED)) ;
- 50.
- 51. if (chown (argv[2], pwdp->pw_uid, -1) == -1)
- 52. err_ret ("chown for uid error ") ;
- 53. else
- 54. printf ("success to change uid") ;
- 55.
- 56. putchar ('\n') ;
- 57.
- 58. if (chown (argv[2], -1, pwdp->pw_gid) == -1)
- 59. err_ret ("chown for gid error ") ;
- 60. else
- 61. printf ("success to change gid") ;
- 62.
- 63. putchar ('\n') ;
- 64.
- 65. exit (0) ;
- 66.}
复制代码 此代码类似于bash的chown命令。从控制台接收三个参数,第一个是程序名,第二个是新的用户名或群组名,第三个是文件名。
第一部分,先输出当前用户的信息(uid,gid,euid,egid);
第二部分,输出新的用户名或群组名的信息,与/etc/passwd保持一致;
第三部分,输出_POSIX_CHOWN_RESTRICTED的值,看系统是否对chown的功能进行了限制;
第四部分,输出是否能改变文件的uid和gid。
实验结果表明,Fedora中对chown的功能是有限制的_POSIX_CHOWN_RESTRICTED被定义为1.
对于非特权用户,只能改变自己文件的所属group,不能改变文件所属者,但可以将自己的文件改变为自己……(听起来很那个= =!)
|