2014-03-27 69 views
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用戶名犯規出現在屏幕上。

回答

1

我正在使用與您的項目相同的功能(例如登錄事件監視),但我必須依靠/var/log/secure文件。它爲我提供了更多的信息。可能你應該考慮到它。

相關問題