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になる必要がある場合です。代わりに、root ユーザーで C プログラムと perl スクリプトを実行しているため、GUI を介してログインしているユーザーに関係なく、perl スクリプトによって現在のユーザーとして root が与えられます。

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 に答える
1

あなたが述べたように、あなたのプログラムはデーモンとして実行されます。したがって、それが生成するプロセスは、そのデーモンを開始したユーザーと同じユーザーとして実行されます。UI (またはその他の方法) を介してログインするユーザーは、デーモンから呼び出して取得できるユーザーにはなりません。whoami

代わりに、デーモンにログインイベントを明示的に通知するか、それがオプションでない場合は、現在ボックスで実行されているすべてのログインセッションのリストを保持し、新しいセッションが表示されるかどうかを確認します-それはセッションです新しくログインしたユーザーの。

于 2012-07-13T09:04:11.227 に答える
0

プログラムwhousersその情報をファイルから取得します/var/run/utmp

このファイルには、「structutmp」のサイズのN個のエントリが含まれて<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 に答える