1 用户信息的获取
除了init程序外,所有的Linux程序都是由其它程序或用户启动的。每个用户有一个唯一的与其关联的用户标识符UID,Linux运行的每个程序都是以某个用户的名义在运行,因而每个程序都记录了启动它的UID,当一个程序的SUID位被置位时,它的运行就好像是由该可执行文件的属主启动的,su命令被执行时,程序由超级用户所启动。ps -l
命令可以看到
#include <sys/types.h>
#include <unistd.h>
uid_t getuid();
gid_t getgid();
char* getlogin();
getuid函数返回用户的UID,它通常是启动该程序的用户UID,类型为uid_t。
getuid函数返回用户的GID,它通常是启动该程序的用户GID,类型为gid_t 。
getlogin函数返回与当前用户关联的登录名。
系统文件/etc/passwd
包含了一个用户账号数据库,由行组成,每行 对应一个用户,包括用户名、加密口令、UID、GID、全名、家目录和默认shell,示例如neil:zBqxfqedfpk:500:100:Neil Matthew:/home/neil:bin/bash
。为了提高安全性,现在的Linux系统已经不再使用这种简单的密码文件了,现在有一个shadow密码文件的选项,原来的密码文件中不再包含任何有用的加密口令信息,这些信息在/etc/shadow
文件中,是一个普通用户无法读取的文件。下列这些函数用于读取该文件
#include <sys/types.h>
#include <pwd.h>
struct passwd* getpwuid(uid_t uid);
struct passwd* getpwnam(const char* name);
getpwuid函数通过UID查询。
getpwnam函数通过用户登录名查询。
passwd结构成员如下图所示,出错时返回空指针并设置errno。
#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
uid_t uid = getuid();
gid_t gid = getgid();
printf("User is %s\n",getlogin());
printf("User IDs: uid = %d,gid = %d\n",uid,gid);
struct passwd* pw = getpwuid(uid);
printf("UID passwd entry:\n name = %s,uid = %d,gid = %d,home = %s ,shell = %s\n",
pw->pw_name,pw->pw_uid,pw->pw_gid,pw->pw_dir,pw->pw_shell);
pw = getpwnam("root");
printf("UID passwd entry:\n name = %s,uid = %d,gid = %d,home = %s ,shell = %s\n",
pw->pw_name,pw->pw_uid,pw->pw_gid,pw->pw_dir,pw->pw_shell);
exit(0);
}
用id
命令也能查询到这些信息
2 主机信息的获取
程序可以获得用户信息以及运行它的计算机的有关细节,主机信息在很多情况下是非常有用的。
#include <unistd.h>
int gethostname(char* name,size_t namelen);
gethostname函数用来获取主机的网络名,把机器的网络名写入name字符串,该字符串长度至少为namelen个字符长,成功时返回0,否则返回-1。
#include <sys/utsname.h>
int uname(struct utsname* name);
uname函数把主机信息写入name指向的结构,成功时返回一个非负整数,否则返回-1并设置errno,结构成员如下所示。
#include <sys/utsname.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
char computer[256];
struct utsname uts;
if(gethostname(computer,255) != 0 || uname(&uts) < 0)
{
fprintf(stderr,"Could not get host information\n");
exit(-1);
}
printf("Computer host name is %s\n",computer);
printf("System is %s on %s hardware\n",uts.sysname,uts.machine);
printf("Nodename is %s\n",uts.nodename);
printf("Version is %s,%s\n",uts.release,uts.version);
exit(0);
}
#include <unistd.h>
long gethostid();
gethostid函数获取每台主机的唯一标识符,许可证管理者可以利用该id确保软件程序只在拥有合法许可证的机器上运行。在Sun工作站上,该函数返回计算机生产时设置在非易失性存储器中的一个数字,对系统硬件来说是唯一的。在Linux中,返回一个基于该机器因特网地址的值,但这对许可证管理来说还不够安全。
用hostid命令功能相同