关于uid和gid的问题

来源:互联网 发布:软件版权修改器 编辑:程序博客网 时间:2024/05/08 02:10

原文地址:http://blog.chinaunix.net/uid-26242642-id-2807939.html

TABLE

1. 获取用户信息
    1.1 获取用户名和uid
    1.2 getuid与getlogin实例
    1.3 获取详细的用户信息
    1.4 getpwuid, getpwnam函数实例
    1.5. getpwuid简单实现
2. 获取系统信息
    2.1 相关函数
    2.2 实例


    本文简单的对linux中获取用户信息和系统相关信息进行学习。

1. 获取用户信息

    1.1 获取用户名和uid

[code]
#include <sys/types.h>
#include <unistd.h>

uid_t getuid(void);
char *getlogin(void);

getuid函数返回程序关联的UID,它通常是启动程序的用户的UID。
getlogin函数返回与当前用户关联的登录名。
[/code]

    1.2 getuid与getlogin实例
[code]
filename:1.c
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>

int main(void)
{
    printf("The UID is %d \n", getuid());
    printf("The login name is %s\n", getlogin());
    return 0;
}
[/code]
    测试:
[code]
[test@test_net code]$ ./1
The UID is 500 
The login name is test
[test@test_net code]$ 
[/code]

    1.3 获取详细的用户信息

    系统文件/etc/passwd包含一个用户帐号数据库。它由行组成,每行对应一个用户,包括:
    用户名、加密口令、用户标识符(UID)、组标识符(GID)、全名、主目录和默认shell。
    编程接口的数据结构:
    strcut passwd {
        char *pw_name;
        char *pw_passwd;
        uid_t pw_uid;
        gid_t pw_gid;
        char *pw_gecos;
        char *pw_dir;
        char *pw_shell;
    }
[code]
#include <sys/types.h>
#include <pwd.h>
struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *name);

    这两个函数都返回一个指针,指向passwd结构。出错时,返回NULL,并设置errno。
void endpwent(void);
void setpwent(void);
struct passwd *getpwent(void);

    这一组函数能够扫描整个文件。getpwent函数依次返回每个用户的信息项,并且将指针后移,当到达文件尾时,返回一个空指针。endpwent终止,并释放资源。setpwent函数重置读指针到密码文件的开始位置。
[/code]
    1.4 getpwuid, getpwnam函数实例
[code]
filename:2.c
#include <assert.h>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>

int main(void)
{
    struct passwd *pw;
    uid_t    uid;
    char    *login;

    uid = getuid();
    assert(uid != -1);
    printf("UID is %d\n", uid);

    login = getlogin();
    assert(login != NULL);
    printf("User is %s\n", login);
    
    pw = getpwuid(uid);
    assert(pw != NULL);
    printf("\n\n\n");
    printf("getpwuid:\n");
    printf("name = %s\nuid = %d\ngid = %d\nhome = %s\nshell = %s\n",\
            pw->pw_name, pw->pw_uid, pw->pw_gid, pw->pw_dir, pw->pw_shell);

    pw = getpwnam("root");
    assert(pw);
    printf("\n\n\n");
    printf("getpwnam(root):\n");
    printf("name = %s\nuid = %d\ngid = %d\nhome = %s\nshell = %s\n",\
            pw->pw_name, pw->pw_uid, pw->pw_gid, pw->pw_dir, pw->pw_shell);

    return 0;
}
[/code]
    测试:
[code]
[test@test_net code]$ ./2
UID is 500
User is test



getpwuid:
name = test
uid = 500
gid = 500
home = /home/test
shell = /bin/bash



getpwnam(root):
name = root
uid = 0
gid = 0
home = /root
shell = /bin/bash
[test@test_net code]$ 

[/code]
    1.5. getpwuid简单实现
[code]
filename:my_getpwuid.c

#include <pwd.h>

static struct passwd *
my_getpwuid(uid_t uid)
{
    struct passwd *ptr;

    setpwent();
    while ((ptr = getpwent()) != 0) {
        if (uid == ptr->pw_uid)
            break;
    }
    endpwent();

    return ptr;
}
[/code] 

2. 获取系统信息

    2.1 相关函数
[code]
#include <unistd.h>
int gethostname(char *name, size_t namelen);
    该函数把机器的网络名写入name字符串。
#include <sys/utsname.h>
int uname(struct utsname *name);
    uname函数把主机信息写入name参数指向的结构。
struct utsname {
    char sysname[];
    char nodename[];
    char release[];
    char version[];
    char machine[];
};
[/code]
    2.2 实例
[code]
filename:3.c
#include <unistd.h>
#include <sys/utsname.h>
#include <stdio.h>

int main(void)
{
    char computer[256];
    struct utsname uts;

    if (gethostname(computer, 255) != 0 ||  uname(&uts) != 0) {
        fprintf(stderr, "can not get host information\n");
        return 1;
    }

    printf("host name: %s\n", computer);
    printf("system name: %s\n", uts.sysname);
    printf("hardware : %s\n", uts.machine);
    printf("nodename : %s\n", uts.nodename);
    printf("release: %s\n", uts.release);
    printf("version: %s\n", uts.version);

    return 0;
}
[/code]
[code]
[test@test_net code]$ ./3
host name: test_net
system name: Linux
hardware : x86_64
nodename : test_net
release: 2.6.40.4-5.fc15.x86_64
version: #1 SMP Tue Aug 30 14:38:32 UTC 2011
[test@test_net code]$ 

[/code]
0 0