我正在记录以1分钟为间隔登录到linux系统的用户。日志将使用root拥有的init.d脚本完成,并在启动时自动启动。
我尝试将getlogin()和getlogin_r()与一个简单的init.d脚本一起使用。但是,如果我通过控制台运行init.d脚本,它将起作用,但是当我通过chkconfig --add [initscript]注册init.d脚本并重新启动系统时,它通过ps -ef作为check运行,但是当我检查了日志文件,用户名为空。
我错过了什么吗?他们是获取登录用户的替代方法吗?
答案 0 :(得分:1)
getlogin()返回指向一个字符串的指针,该字符串包含在进程的控制终端上登录的用户的名称;如果无法确定此信息,则返回空指针。
通过init运行的脚本没有控制终端。而如果您通过控制台运行脚本,则控制台是控制(虚拟)终端。
getlogin()
不会执行您想要的操作。我认为您应该看看users
和who
命令。
答案 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;
}