Intereting Posts
Инициализация значений в конце указателя на указатель на цепочку указателей Генерация абсолютно случайных чисел без случайной функции? Почему инструкция VMOVAPS AVX-256 копирует только четыре одиночных прецизионных поплавка вместо 8? Даже четность unsigned int #include : Нет такого файла или каталога (даже если источник и заголовок находятся в одном каталоге) Смутно о доступе к элементам структуры через указатель Что не так с этим кодом для написания BMP с серой шкалой из образа RGB bmp pure C – ОС Windows Обнаружено повреждение кучи: после нормального блока Ошибка BGI, как его решить? Как #ifdef по CompilerType? GCC или VC ++ функция десериализации (массив байтов – uint32) Понимание иерархии типов C11 Как создать каталог с правообладателями с помощью C on Posix запись в закрытом соединении не генерирует sigpipe немедленно Имея функцию, измените значение, которое указатель представляет в C

Как обнаружить пользователя, зарегистрированного через GUI в Linux

Я хотел бы записать имя пользователя, зарегистрированное через GUI в моей программе. Моя программа работает как демон из корневого входа. Если пользователь root не входит в систему через GUI, моя программа должна быть уведомлена. Я вставляю свою текущую программу, которая вызывает скрипт perl, используя системный вызов, чтобы проверить, кто входит в текущий пользователь. Я также вставляю свой скрипт perl для справки.

#include  #include  #include  #include  #include  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 я вызываю скрипт perl в цикле while каждые 5 секунд. Скрипт perl использует команду «whoami», чтобы заставить текущего пользователя войти в систему и выгрузить ее в файл / tmp / log.

То, что я хочу достичь, – это если user1 регистрируется в perl-скрипте, должен дать мне текущий пользователь user1. Вместо этого скрипт perl дает мне root как текущего пользователя, независимо от пользователя, с которым я зарегистрирован через графический интерфейс, поскольку я запускаю скрипт C и Perl-скрипт с пользователем root.

Мог ли кто-нибудь, пожалуйста, посоветовать мне механизм, с помощью которого программа C могла бы узнать текущего пользователя, зарегистрированного через графический интерфейс? Любая помощь приветствуется.

Вы можете обнаружить пользователя с помощью основного дисплея следующим образом:

 #!/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) 

Как вы упомянули, ваша программа работает как демон. Следовательно, любой процесс, который он запускает, будет запускаться как тот же пользователь, что и тот, который запустил этот демон. Пользователь, который регистрируется через пользовательский интерфейс (или любой другой метод), никогда не будет пользователем, которого вы можете получить, вызвав whoami из вашего демона.

Вместо этого вы должны явно сообщить об этом вашему демонам события входа или, если это не вариант, сохраните список всех сеансов входа в систему, которые в настоящее время выполняются в поле, и посмотрите, появятся ли новые сеансы – это будет сеанс только что зарегистрированного пользователя.

Я использую XFCE4 и LXDM. «кто» и «пользователи» сообщают только пользователям, которые зарегистрированы на терминале. Вход в 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. ; } 

Программы, who и users получают свою информацию из файла /var/run/utmp .

Файл содержит N записей размера «struct utmp», определенных в Вас интересуют USER_PROCESS типа 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

Вероятно, вы захотите исследовать либо ConsoleKit, либо его новый логин инкарнации.

Эти инструменты специально разработаны для управления сиденьями и сеансами, при этом сохраняя различие между локальной текстовой консолью, графическим интерфейсом и удаленными сеансами. Они не гарантируют присутствия на каждой машине X11, но если у вас относительно недавние, скорее всего, он использует один или другой инструмент.