2

我想在我的程序中捕获通过 GUI 登录的用户名。我的程序从 root 登录作为守护进程运行。如果非 root 用户通过 GUI 登录,我的程序应该会收到通知。我正在粘贴我当前的程序,该程序调用一个 perl 脚本,利用系统调用来检查谁是当前登录的用户。我也在粘贴我的 perl 脚本以供参考。

#include <X11/Xlib.h>
#include <X11/Xos.h>
#include <X11/Xfuncs.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
int main()
{
    char *user;
    char buf[1024];
    int fd, ret;
    fd = open("/tmp/log", O_TRUNC|O_RDWR|O_CREAT);
    if (!fd) {
        printf("Error opening file\n");
        exit(1);
    }
    chmod("/tmp/log", S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP
            | S_IROTH | S_IWOTH | S_IXOTH);
    daemon(0, 0);
    while (1) {
        system("perl /home/curr-usr.pl");
        sleep(5);
    } 
    return 0;
}

用于获取当前用户登录的 perl 脚本。

#!/usr/bin/perl
my $result;
$result = `whoami`;
open FH, "+>>", "/tmp/log" or die $!;
print FH "$result ";
close (FH);

在上面的 c 程序中,我每 5 秒在一个 while 循环中调用 perl 脚本。perl 脚本使用命令“whoami”来让当前用户登录并将其转储到 /tmp/log 文件中。

我想要实现的是,如果 user1 登录 perl 脚本应该给我当前用户是 user1。相反,perl 脚本给了我作为当前用户的 root,而不管我通过 GUI 登录的用户是什么,因为我正在使用 root 用户运行 C 程序和 perl 脚本。

谁能告诉我C程序可以通过GUI了解当前用户登录的机制吗?任何帮助是极大的赞赏。

4

6 回答 6

6

您可以像这样使用主显示屏检测用户:

#!/bin/bash

#Detect the name of the display in use
display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"

#Detect the user using such display
user=$(who | grep '('$display')' | awk '{print $1}')

#Detect the id of the user
uid=$(id -u $user)
于 2016-10-27T15:28:13.630 回答
2

我正在使用 XFCE4 和 LXDM。“谁”和“用户”只报告登录终端的用户。没有像 Nominal Animal 指出的那样报告 GUI 登录(谢谢!)。我使用“pgrep xfce”来检查 XFCE4 是否正在运行。下面打印出当前的 xfce 用户:

#!/usr/bin/perl

# Get all processes
my @xfce_processes = `pgrep xfce`;

# If processes exist, get user of first process in list.
if(scalar  @xfce_processes) {
    print `ps -o user h $xfce_processes[0]`;
}
else
{
# No xfce processes. 
     ;
}
于 2013-04-16T14:07:53.220 回答
1

正如您提到的,您的程序作为守护程序运行。因此,它产生的任何进程都将以与启动该守护程序的用户相同的用户身份运行。通过 UI(或任何其他方法)登录的用户永远不会是您可以通过whoami从您的守护进程调用获得的用户。

相反,您应该做的是明确通知您的守护进程登录事件,或者,如果这不是一个选项,请保留当前在盒子上运行的所有登录会话的列表,并查看是否出现新会话 - 这将是一个会话一个新登录的用户。

于 2012-07-13T09:04:11.227 回答
0

程序whousers从文件中获取它们的信息/var/run/utmp

该文件包含 N 个大小为“struct utmp”的条目,定义在<utmp.h> 您对USER_PROCESS类型条目感兴趣。主机字段包含显示。

请注意,如果用户打开一些终端仿真(xterm、konsole...),则同一显示会有多个条目。

您可以监视此文件或/var/log/wtmp历史记录

struct utmp ut_entry;
FILE    *fp = fopen(UTMP_FILE, "r");

if( !fp )
{
  printf("Could not open utmp file!");
  return;
}

while(fread(&ut_entry, sizeof(struct utmp), 1, fp) == 1)
{
    if(ut_entry.ut_type != USER_PROCESS)
        continue;

    // string entries are not 0 terminated if too long...
    // copy user name to make sure it is 0 terminated

    char tmpUser[UT_NAMESIZE+1] = {0};
    strncpy(tmpUser, ut_entry.ut_user, UT_NAMESIZE);

    // do more stuff... read the display from ut_entry.host
}

有关更多信息,请参阅utmp 手册页

于 2012-10-02T18:33:43.053 回答
0

您可能想调查ConsoleKit或其更新的化身loginctl

这些工具专为管理席位和会话而设计,同时保持本地文本控制台、GUI 和远程会话之间的区别。它们不能保证出现在每台 X11 机器上,但如果你的机器是相对较新的,它很可能使用其中一种工具或另一种工具。

于 2013-04-18T14:53:03.090 回答
0

对于其他来这里参加 xfce4 的人,我要做的就是运行,ps -aux | grep xfce4然后有一行:

root 2497 0.0 0.3 323052 13408 ? Sl 01:24 0:00 xfce4-session

我跑kill -9 2497了,这摆脱了它。对我来说,这是一个我想从 SSH 中删除的挂起实例。

于 2020-06-25T01:43:32.103 回答