`

apue 学习之 Chapter 4 - chown

阅读更多

 

4.11. chown, fchown, and lchown Functions

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

 

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

实验代码如下:

 

#include <stdio.h>
#include <unistd.h>
#include "apue.h"
#include "myerr.c"
#include <pwd.h>

#ifdef _POSIX_CHOWN_RESTRICTED
#undef _POSIX_CHOWN_RESTRICTED
#endif
#define _POSIX_CHOWN_RESTRICTED 0

int
main (int argc, char *argv[])
{
	uid_t	uid ;
	struct passwd	*pwdp ;
    int     i, j ;
    char    *endptr ;
	char	bSuccess ;
	
    if (argc != 3)
        err_quit ("usage : a.out <attribute> <filename> ...\n") ;

    printf ("current user id :\t\t %d\n", getuid ()) ;
    printf ("current group id :\t\t %d\n", getgid ()) ;
    printf ("current effective user id :\t %d\n", geteuid ()) ;
    printf ("current effective ground id :\t %d\n", getegid ()) ;

    uid = strtol (argv[1], &endptr, 0) ;
    if (*endptr != '\0') {		// user name
        if ((pwdp = getpwnam (argv[1])) == NULL)
            err_msg ("getpwnam error : ") ;
    } else {
        if ((pwdp = getpwuid (uid)) == NULL)
            err_msg ("getpwuid error : ") ;
    }

	puts ("\nuser/group info by getpwnam/getpwuid function:") ;
    printf ("user : %s\n", pwdp->pw_name) ;
    printf ("pwd  : %s\n", pwdp->pw_passwd) ;
    printf ("uid  : %d\n", pwdp->pw_uid) ;
    printf ("gid  : %d\n", pwdp->pw_gid) ;
    printf ("uifo : %s\n", pwdp->pw_gecos) ;
	printf ("home : %s\n", pwdp->pw_dir) ;
	printf ("shell: %s\n", pwdp->pw_shell) ;
    printf ("-------\n") ;

	printf ("_POSIX_CHOWN_RESTRICTED : %ld\n", 
		pathconf (argv[2], _PC_CHOWN_RESTRICTED)) ;

    if (chown (argv[2], pwdp->pw_uid, -1) == -1) 
        err_ret ("chown for uid  error ") ;
	else
		printf ("success to change uid") ;
	
	putchar ('\n') ;

    if (chown (argv[2], -1, pwdp->pw_gid) == -1)
        err_ret ("chown for gid  error ") ;
	else
		printf ("success to change gid") ;

	putchar ('\n') ;

    exit (0) ;
}
 

 

此代码类似于bashchown命令。从控制台接收三个参数,第一个是程序名,第二个是新的用户名或群组名,第三个是文件名。

第一部分,先输出当前用户的信息(uidgideuidegid);

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

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

第四部分,输出是否能改变文件的uidgid

 

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

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

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics