歡迎您光臨本站 註冊首頁

apue 學習之 Chapter 4 - chown

←手機掃碼閱讀     火星人 @ 2014-03-03 , reply:0

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,不能改變文件所屬者,但可以將自己的文件改變為自己……(聽起來很那個= =!)
《解決方案》

謝謝分享

[火星人 ] apue 學習之 Chapter 4 - chown已經有403次圍觀

http://coctec.com/docs/service/show-post-1235.html