通过Daemon获取当前用户登录Linux的权限

时间:2019-07-14 11:24:43

标签: linux glibc init

我正在记录以1分钟为间隔登录到linux系统的用户。日志将使用root拥有的init.d脚本完成,并在启动时自动启动。

我尝试将getlogin()和getlogin_r()与一个简单的init.d脚本一起使用。但是,如果我通过控制台运行init.d脚本,它将起作用,但是当我通过chkconfig --add [initscript]注册init.d脚本并重新启动系统时,它通过ps -ef作为check运行,但是当我检查了日志文件,用户名为空。

我错过了什么吗?他们是获取登录用户的替代方法吗?

2 个答案:

答案 0 :(得分:1)

  

getlogin()返回指向一个字符串的指针,该字符串包含在进程的控制终端上登录的用户的名称;如果无法确定此信息,则返回空指针。

通过init运行的脚本没有控制终端。而如果您通过控制台运行脚本,则控制台是控制(虚拟)终端。

getlogin()不会执行您想要的操作。我认为您应该看看userswho命令。

答案 1 :(得分:0)

@ypnos, 我没有费心检查您从链接github.com/coreutils/coreutils/blob/master/src/who.c提供的 who.c

我使用了与下面的代码段不同的方法。

#include <stdio.h>
#include <utmpx.h>
#include <time.h>


int main (void)
{
    struct utmpx *UtmpxPtr = NULL;
    struct tm *TimePtr = NULL;
    time_t TimeInSec;
    char TimeBuff[32];

    printf("...Start \"who logged-in\"...\n");

    setutxent();
    while ((UtmpxPtr = getutxent()) != NULL)
    {
        if (UtmpxPtr->ut_type != USER_PROCESS)
        {
            continue;
        }

        TimeInSec = UtmpxPtr->ut_tv.tv_sec;
        TimePtr = localtime(&TimeInSec);
        strftime(TimeBuff, sizeof(TimeBuff), "%Y-%m-%d|%H:%M", TimePtr);

        printf("%s|%s|%s\n", UtmpxPtr->ut_user, TimeBuff, UtmpxPtr->ut_host);
        fflush(stdout);
    }

    endutxent();
    return 0;
}