Unix环境编程-系统文件和信息

 

一、etc/passwd文件

 

1

名称:

getpwuid/getpwnam

功能:

Getpassword file entry

头文件:

#include <pwd.h>

函数原形:

struct passwd *getpwuid(uid_t uid);

struct passwd *getpwnam(const char *name);

参数:

Uid   用户id 

返回值:

若成功则返回指针,若出错则返回NULL

 

Getpwuid函数由ls(1)程序使用,它将i节点中的数值用户id映射为用户登录名。在键入登录名时,getpwnam函数由login(1)程序使用。

 

这些系统信息都是在/ect/passwd文件中读出的。里面记录着许多用户登录信息。

用户名                  char *pw_name

加密口令                char *pw_passwd

数值用户ID              uid_t pw_uid

数值组ID                gid_t pw_gid

注释字段                char *pw_gecos

初始工作目录            char *pw_dir

初始shell                char *pw_shell

用户访问类              char *pw_class

下次更改口令时间        time_t pw_chang

帐户到期时间            time_t pw_expire

 

下面是显示当前用户信息的例子:

/*5_1.c*/

#include <sys/types.h>

#include <pwd.h>

#include <unistd.h>

 

main()

{

struct passwd *ptr;

 

if((ptr=getpwuid(getuid()))<0)

    perror(“error”);

printf(“name:%s\n”,ptr->pw_name);

printf(“uid:%d\n”,ptr->pw_uid);

printf(“gid:%d\n”,ptr->pw_gid);

}

上面的程序用到了函数getuid来获取当前用户的数值id.

 

2.

名称:

getpwent/setpwent/endpwent

功能

get password file entry

头文件

#include <pwd.h>

#include <sys/types.h>

函数原形

struct passwd *getpwent(void);

void setpwent(void);

void endpwent(void);

参数:

返回值:

若成功则返回指针,若出错则返回NULL

 

3个函数可以查看/ect/passwd文件中的所有信息。也就是可以用这几个函数来查看系统所有的注册用户的信息。调用getpwent时,它返回口令文件中的下一个记录项。函数setpwent反绕它所使用的文件。Endpwent则关闭这些文件。下面是一个例子用来列出系统的所有用户.

/*5_2.c*/

#include <stdio.h>

#include <pwd.h>

 

int main()

{

struct passwd *pwd;

setpwent();

while((pwd=getpwent())!=NULL)

{

    printf(“uid:%d\n”,pwd->pw_uid);

    printf(“name:%s\n”,pwd->pw_name);

}

endpwent();

}

 

在程序开始处调用setpwent是自我保护性的措施,以便在调用getpwent打开有关文件情况下,反绕有关文件使他们定位到文件开始处。在使用getpwent查完口令文件后,一定要调用endpwent关闭这些文件.getpwent知道什么时候它应打开它所使用的文件(第一次被调用时),但是它并不知道何时关闭这些文件。

 

3.

名称:

getspnam/getspent/setspent/endspent

功能:

encrypted password file routines

头文件:

#include <shadow.h>

函数原形:

struct spwd *getspent();

struct spwd *getspnam(char *name);

void setspent();

void endspent();

参数:

name   用户名

返回值:

若成功则返回指针,若出错则返回NULL

 

加密口令是经单向加密算法处理过的用户口令副本。现在,某些系统将加密口令存放在另一个通常称为阴影口令的文件中。该文件包含的字段有。

用户登录名                       char *sp_namp

加密口令                         char *sp_pwdp

上次更改口令以来经过的时间       long sp_lstchg

经过多少天后容许更改             int sp_min

要求更改声音剩余天数             int sp_max

到期警告天数                     int sp_warn

帐户不活动以前尚余天数           int sp_inact

帐户到期天数                     int sp_expir

保留                             unsigned int sp_flag

 

/*5_3.c*/

#include <shadow.h>

#include <stdio.h>

 

main()

{
    struct spwd *pwd;

 

setspent();

while((pwd=getspent())!=NULL)

{

    printf(“name:%s\n”,pwd->sp_namp);

    printf(“name:%s\n”,pwd->sp_pwdp);

}

endpwent();

}

 

 

二、ect/group文件

4

名称:

getgrgid/getgrnam

功能:

get group file entry

头文件:

#include <grp.h>

#include <sys/types.h>

函数原形:

struct group *getgrnam(const char *name);

struct group *getgrgid(gid_t gid);

参数:

name    用户名

gid      用户组id

返回值:

若成功则返回指针,若出错则返回NULL

 

用户组的信息包含在/ect/group文件中,该文件包括如下信息。

组名                       char *gr_name

加密口令                   char *gr_passwd

数值组id                   int gr_gid

指向各用户名的指针数组     char **grmen

 

/*5_4.c*/

#include <sys/types.h>

#include <grp.h>

#include <unistd.h>

 

main()

{

struct group *grp;

 

if((grp=getgrgid(getgid()))<0)

    perror(“error”);

else

{

    printf(“gname:%s\n”,ptr->gr_name);

    printf(“gid:%d\n”,ptr->gr_gid);

}

}

 

5

名称:

getgrent/sergrent/endgrent

功能:

get group file entry

头文件:

#include <grp.h>

函数原形:

void group *getgrent();

void setgrent();

void endgrent();

参数:

返回值:

若成功则返回指针,若出错则返回NULL

 

上面两组函数类似于针对口令的几个函数。大家可以仿照程序5_2.c编写打印系统所有组的组名,和组id的程序。/*5_5.c */

 

6.

名称:

getgroups/setgroups/initgroups

功能:

get group file entry

头文件:

#include <grp.h>

#include <unistd.h>

函数原形:

int getgroups(int gidsetsize,gid_t grouplist[]);

int setgroups(int ngroups,const gid_t grouplist[];

int initgrops(const char *username,gid_t basegid);

参数:

grouplist[]  用于存放附加组id

gidsetsize  最大存放id的个数            

ngroups    数组中元素的个数

username   用户名

返回值:

getgroups  若成功则返回附加组id数,若出错则返回-1

setgroups/ initgrops  若成功则返回0,若出错则返回-1

 

一个用户不仅属于口令文件记录项中组id所对应的组。也可以属于多达16个另外的组。在这里另外的组id叫附加组id。这样我们就可以实现一个人属于多个组了。下面的例子功能是打印当前用户的附加主组id

/5_6.c

#include <stdio.h>

#include <unistd.h>

#include <grp.h>

#include <sys/type.h>

 

iint main()

{

int num;

int i;

int gidsetsize=16;

gid_t grouplist[16];

num=getgroups(gidsetsize,grouplist);

for(i=0;i<num;i++)

    printf(“%d\n”,grouplist[i]);

}

 

Getgroups将进程所属用户的各添加组ID填写到grouplist中,填写入该数组的添加组ID最多为gidsetsize个。实际填写到数组中的添加组ID数由函数返回。

Setgroups可由超级用户调用以便为调用进程设置添加组ID表。Grouplist是组ID数组,而ngroups说明了数组中的元素数。

通常只有initgroups函数调用setgroups,initgroups读整个组文件,然后对username确定其组的成员关系。然后,它调用setgroups,以便为该用户初始化添加组ID表。

 

三、获得主机名

7

名称:

uname

功能:

get name and information about current kernel

头文件:

#include <sys/utsname.h>

函数原形:

int uname(struct utsname *buf);

参数:

name  主机名

返回值:

若成功则返回非负值,若出错则返回-1

 

Uname函数返回与当前主机和操作系统有关信息。通过该函数的参数向其传递一个utsname结构的地址,然后该函数填写该结构。

struct utsname{

       char sysname[9];

       char nodename[9];

       char release[9];

       char version[9];

       char machine[9];

}

 

/*5_7.c*/

#include <stdio.h>

#include <sys/utsname.h>

#include <error.h>

 

main()

{

struct utsname buf[10];

if((uname(buf))<0)

    perror(“error”);

else

{

printf(“%s “,buf->sysname);

printf(“%s”,buf->nodename);

printf(“%s”,buf->release);

printf(“%s”,buf->version);

printf(“%s”,buf->machine);

      }

}

 

 

8

名称:

gethostname

功能:

get group file entry

头文件:

#include <unistd.h>

函数原形:

int gethostname(char *name,int namelen)

参数:

name      缓冲区

namelen    指定name缓冲区长度

返回值:

若成功则返回0,若出错则返回-1

 

Gethostname函数的功能是返回系统的主机名。该名字通常是TCP/IP网络上的主机的名字。

/*5_8.c*/

#include <stdio.h>

#include <unistd.h>

 

main()

{

char name[10];

int namelen;

 

if((gethostname(name,namelen)<0)

     perror(“error”);

else

printf(“%s\n”,name);

}

 

 

    除了这些系统文件,linux还有其它系统文件记录着系统信息。如utmp(/var/run/utmp)记录着当前登录进系统的各个用户。wtmp(/var/log/wtmp)跟踪各个登录和注销事件。

 

四、linux中的系统文件总结:

1.文件位置:/ect/passwd  文件功能:口令文件 头文件:<pwd.h> 结构passwd包括信息:用户名(char *pw_name,加密口令(char * pw_passwd,数值用户iduid_t pw_uid),数值组id(uid_t pw_gid),注释字段(char *pw_gecos,初始工作目录(char *pw_dir,初始Shellchar *pw_shell,用户防问类(char *pw_class,下次更改口令时间(time_t pw_change,帐户到期时间(time_t pw_expire)相关函数: getpwuid/getpwnam(读当前用户的信息) getpwent/setpwent/endpwent(读所有用户的信息).

2.文件位置:/ect/shadow 文件功能:阴影口令文件 头文件:<shadow.h> 结构:spwd包括信息:用户登录名(char *sp_namp),加密口令(char *sp_pwdp),上次更改口令以来经过的时间(int sp_lstchg),经过多少天后容许更改(nt sp_min),要求更改声音剩余天数(int sp_max),到期警告天数                     int sp_warn),帐户不活动以前尚余天数(int sp_inact),帐户到期天数(int sp_expir),保留(unsigned int sp_flag)。相关函数:getspnam/getspent/setspent/endspent

       3.文件位置:/ect/group 文件名:组文件 头文件:<grp.h> 结构:group 包括信息:组名(char *gr_name),加密口令                   char *gr_passwd),数值组id(int gr_gid),指向各用户名的指针数组(char **grmen)。相关函数:getgrgid/getgrnam (读取当前用户的组信息)getgrent/sergrent/endgrent(读取所有组的信息)。

    4.文件位置: /ect/host 文件功能:记录主机信息 头文件:<notdb.h> 结构:hostent 相关函数:gethostbyname/gethostbyaddr

    5. 文件位置:/ect/networks 文件功能:记录网络信息 头文件:<netdb.h> 结构:netent 相关函数: getnetbyname/getnetbyaddr

    5.文件位置:/ect/protocols 文件功能:记录协议信息 头文件:<netdb.h> 结构:protoent 相关函数:getprotobyname/getprotobynumber

    6.文件位置:/ect/services 文件功能:记录服务信息 头文件:<netdb.h> 结构:servent 相关函数:getservbyname,getservbyport

7.文件位置:/var/run/utmp 文件功能:记录当前登录进系统的各个用户。头文件:<unmp.h> 结构:utmp

    8.文件位置:/var/log/wtmp 文件功能:记录登录和注销事件。

 

 

你可能感兴趣的:(unix)