Linux编程环境下获取用户和主机信息

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命令功能相同
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值