获取用户和用户组信息
获取uid,gid和登录用户名
#include <stdio.h>#include <stdlib.h>#include <unistd.h> /*包含相关函数的头文件*/#include <sys/types.h>int main(int argvLength, char *argv []){ uid_t uid; // 输出 uid 用户标识符 gid_t gid; // 输出 gid 组标识符 uid = getuid(); gid = getgid(); // char *getlogin(void) 输出当前登录用户名 printf("username=%s \n", getlogin()); printf("uid=%d,gid=%d\n", uid, gid); /* username=root uid=501,gid=20 */ return 0;}
获取所有用户账户信息
#include <stdio.h>#include <stdlib.h>#include <pwd.h> /*包含相关函数的头文件*/#include <sys/types.h>// struct passwd// {// char *pw_name; // 用户账号// char *pw_passwd; // 用户密码// uid_t pw_uid; // 用户标识符// gid_t pw_gid; // 组标识符// char *pw_gecos; // 全名// char *pw_dir; // 主目录// char *pw_shell; // 所使用的Shell路径// };int main(int argvLength, char *argv[]){ struct passwd *user; // struct passwd *getpwent(void); 用来返回用户信息,每一次读一项,直到读到NULL为止 // 系统账户信息,一般存储在/etc/passwd中 user = getpwent(); int i = 0; while (user != NULL) { // printf("%s\n", user->pw_name); user = getpwent(); i++; } printf("%d\n", i); // 使用了getpwent要记得关闭文件 endpwent(); return 0;}
获取指定用户信息
#include <stdio.h>#include <stdlib.h>#include <pwd.h> /*包含相关函数的头文件*/#include <sys/types.h>// struct passwd// {// char *pw_name; // 用户账号// char *pw_passwd; // 用户密码// uid_t pw_uid; // 用户标识符// gid_t pw_gid; // 组标识符// char *pw_gecos; // 全名// char *pw_dir; // 主目录// char *pw_shell; // 所使用的Shell路径// };int main(int argvLength, char *argv[]){ struct passwd *user; // struct passwd *getpwnam(const char *name); // 用来返回指定用户信息 // 系统账户信息,一般存储在/etc/passwd中 user = getpwnam("root"); if (user != NULL) { printf("%s \n", user->pw_name); // root } return 0;}
获取当前登录用户信息
#include <stdio.h>#include <stdlib.h>#include <utmpx.h>// #include <utmp.h> /**警告:“utmp”已弃用[-Wdeprecated声明]*/// struct utmp {// short int ut_type; /**登录类型*/// pid_t ut_pid; /**登录进程的标识符*/// char ut_line[UT_LINESIZE]; /**登录设备名*/// char ut_id[4]; /**控制终端名*/// char ut_user[UT_NAMESIZE]; /**登录账号*/// char ut_host[UT_HOSTSIZE]; /**远程主机名*/// struct exit_status ut_exit; /**进程(HEAD_PROCESS)的结束状态*/// long int ut_session; /**会话标识符*/// struct timeval ut_tv; /**时间记录*/// int32_t ut_addr_v6[4]; /**登录主机IP地址*/// char __unused[20]; /**保留*/// }int main(int argc, char **argv) { struct utmpx *user; while ((user = getutxent()) != NULL) { if (user->ut_type == USER_PROCESS) { // 判断是否为普通用户进程 printf("user=%s 登录设备名=%s\n", user->ut_user, user->ut_line); } } endutxent(); /*关闭文件*/ return 0;}