apue 學習之 Chapter 4 - chown
apue 學習之 Chapter 4 - chown
4.11. chown,fchown, and lchown Functions
在做實驗之前,因為操作vim和bash環境設置的問題搞了好長時間,總算勉勉強強順手了。不過vim操作和bash腳本編程,.vimrc和.bashrc編寫確實要抽時間來熟悉一下。
本例的初衷是為了理解上面那幾個函數,不過我想功能應該是差不多的,於是就只選取了chown來做實驗。
實驗代碼如下:
view plaincopy to clipboard01.#include
02.#include
03.#include "apue.h"
04.#include "myerr.c"
05.#include
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 ...\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, &endptr, 0) ;
30. if (*endptr != '\0') { // user name
31. if ((pwdp = getpwnam (argv)) == 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, _PC_CHOWN_RESTRICTED)) ;
50.
51. if (chown (argv, 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, -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,不能改變文件所屬者,但可以將自己的文件改變為自己……(聽起來很那個= =!)
《解決方案》
謝謝分享