我有一个用于检查用户是否登录的用户列表的功能。(粗略地说,用户与服务器有活动连接)。
这是代码:
static int is_login(char *user)
{
int found = 0;
struct utmpx *u;
setutxent();
while ((u = getutxent())) {
if ((strcmp(u->ut_user,user)==0) && (u->ut_type ==USER_PROCESS)) {
found = 1;
break;
} else {
found =0;
}
}
endutxent();
return found;
}
不要弄错。这段代码很好用。唯一的问题是/ var / run / utmp权限未设置为可读。例如:chmod /var/run/utmp 600.
。更糟糕的是,如果服务器没有utmp。而是使用一个utmps。是否有任何其他功能可以与getutxent()
做同样的事情?到目前为止,我发现的只有getpwuid(getuid())
和getlogin()
,它只返回登录控制终端的用户。
这是我测试过的
#include <unistd.h>
#include <stdio.h>
#include <pwd.h>
int main()
{
char *name;
struct passwd *pass;
while(pass = getpwuid(getuid())) //I've tested also with getlogin(), but without the struct ofcourse.
{
name = pass->pw_name;
printf("user = %s\n",name);
}
return 0;
}
在运行此测试程序时,我使用另外两个不同的用户登录到该系统,但这两个用户的名字没有显示在屏幕上。
答案 0 :(得分:1)
我正在使用与您相同的功能处理项目(例如登录事件监控),但我必须依赖/var/log/secure
文件。它为我提供了更多的信息。也许你应该考虑到它。