1
我有一個函數用於檢查用戶列表是否有用戶登錄(粗略地說,用戶有一個到服務器的活動連接)。如何檢查用戶列表是否已登錄?
這是代碼:
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;
}
在運行這個測試程序,我登錄時使用2個不同的用戶到了該系統,但那些2用戶名犯規出現在屏幕上。