The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Как в программе на Си узнать от какого пользователя запущен активный экран
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcmp
#include <utmpx.h>

#define XTTY  ":0"

int main(void)
{
    struct utmpx *entry;

    setutxent();

    while ( (entry = getutxent()) != NULL) {
         if ( !strcmp(entry->ut_line, XTTY) )
         printf("%s %s\n",entry->ut_line, entry->ut_user);
    }
    endutxent();
return(EXIT_SUCCESS);
}
 
21.05.2010 , Автор: pavlinux
Ключи: gcc, screen, tty / Лицензия: CC-BY
Раздел:    Корень / Программисту и web-разработчику / C/C++, сборка, отладка

Обсуждение [ Линейный режим | Показать все | RSS ]
 
  • 1.1, Гений, 10:32, 21/05/2010 [ответить] [смотреть все]
  • +1 +/
    дооо, звать strcmp на стоку из двух байт....
     
     
  • 2.2, Anonimous, 11:00, 21/05/2010 [^] [ответить] [смотреть все]
  • –1 +/
    >> strcmp на стоку из двух байт

    А кто-то обещал, что всегда и везде будет именно "строка из двух байт"?
    Ну тогда, во-первых, из трех. И, во-вторых, это решение будет работать с _любой_ строкой, в отличие от.
    Ну и, в третьих, День Пионерии был позавчера. ;-)

     
  • 2.4, Одмин, 12:04, 21/05/2010 [^] [ответить] [смотреть все]
  • +/
    Какой вариант с твоей точки зрения правильный? Сравнить побайтно?
     
     
  • 3.14, pavlinux, 03:45, 05/06/2010 [^] [ответить] [смотреть все]
  • +/
    Ниже смотри...
     
  • 1.5, vitja, 13:13, 21/05/2010 [ответить] [смотреть все]
  • +/
    Чего-то не работает...

    убрал strcmp

    ~ reboot
    ~ runlevel
    tty4 LOGIN
    tty5 LOGIN
    tty2 LOGIN
    tty3 LOGIN
    tty6 LOGIN
    tty1 LOGIN
    tty7 myuser
    pts/0 myuser
    pts/2 myuser
    pts/3 myuser
    pts/5 myuser
    pts/7 myuser
    pts/8 myuser
    pts/9 myuser
    pts/10 myuser
    pts/12 myuser
    pts/14 myuser
    pts/16 myuser
    pts/18 myuser
    pts/19 myuser
    pts/1 myuser

     
  • 1.6, FrBrGeorge, 03:19, 24/05/2010 [ответить] [смотреть все]  
  • +/
    Поправочка:

    Эта программа показывает все акты регистрации пользователей, при которых в поле ut_line было записано ":0".

    У меня не работает, во-первых, потому что в поле ut_line вообще никто не пишет ":0", а пишет в ut_host, во-вторых, потому что пишется ":0.0" (что единственно правильно для многоголовых карт), и в-третьих, потому что туда пишется запись при всяком открытии терминала, например, при запуске очередного xterm-а.

     
  • 1.7, cvsup, 16:10, 24/05/2010 [ответить] [смотреть все]  
  • +/
    Очередной день открытий.
    Может, if ( !strcmp(entry->ut_host, XTTY) )
    ?

         ut_line  The name of the TTY character device, without the leading /dev/
                  prefix, corresponding with the device used to facilitate the
                  user login session.  If no TTY character device is used, this
                  field is left blank.  This field is only applicable to entries
                  of type USER_PROCESS and LOGIN_PROCESS.

         ut_host  The network hostname of the remote system, connecting to perform
                  a user login.  If the user login session is not performed across
                  a network, this field is left blank.  This field is only appli-
                  cable to entries of type USER_PROCESS.

    В линуксе afaik путевого мана нет.

    В солярисе:
         char                 ut_line[32];   /* device name (console, lnxx) */
         char                 ut_host[257];  /* host name, if remote */

    Проверочное слово w, смотрим колонку FROM (ut_host)

     
  • 1.8, Igor, 18:04, 24/05/2010 [ответить] [смотреть все]  
  • –1 +/
    Файл get_active_screen_user.sh:
    [CODE]
    #!/bin/bash
    who | awk '{ if(match($5,":0")!=0)  print $1 " " $2 }'
    [/CODE]

    Итог:

    $ who
    Результат:
    igor     tty2         2010-05-24 16:53
    root     tty3         2010-05-24 16:58
    igor     tty1         2010-05-24 15:14 (:0)
    igor     pts/2        2010-05-24 15:21 (:0.0)
    igor     pts/3        2010-05-24 15:46 (:0.0)

    $ ./get_active_screen_user.sh
    Результат:
    igor tty1
    igor pts/2
    igor pts/3
    P.S.: OS Fedora 11.

     
  • 1.9, Igor, 19:36, 24/05/2010 [ответить] [смотреть все]  
  • +/
    // code getactivescreenuser.cpp
    #include <stdio.h>
    #include <stdlib.h>
    #include <utmpx.h>
    int main(void)
    {
        struct utmpx *entry;
        setutxent();
        while ( (entry = getutxent()) != NULL)
    {
              if ( (entry->ut_host[0]==':')&&(entry->ut_host[1]=='0') )
            printf("%s %s\n",entry->ut_line, entry->ut_user);
    }
        endutxent();
    return(EXIT_SUCCESS);
    }

    Результат:
    $ ./getactivescreenuser
    tty1 igor
    pts/2 igor
    pts/3 igor
    $ who
    igor     tty1         2010-05-24 15:14 (:0)
    igor     pts/2        2010-05-24 15:21 (:0.0)
    igor     pts/3        2010-05-24 17:55 (:0.0)
    igor     tty2         2010-05-24 18:35

     
     
  • 2.15, pavlinux, 02:41, 09/06/2010 [^] [ответить] [смотреть все]  
  • +/
    >  if ( (entry->ut_host[0]==':') && (entry->ut_host[1]=='0') )

    1. Если б я так написал с самого начала, вы б нифига не поняли о чем речь :)
       Оптимизация это хорошо, но при условии хорошей документации.

    2. Хард-код это опасно, - entry->ut_host[1]=='0' не есть entry->ut_host[1] == 0;
    Мелочь, а искать этот баг будешь ой как долго.


     
  • 1.10, cvsup, 23:30, 24/05/2010 [ответить] [смотреть все]  
  • +/
    Есть небольшой нюанс, ut_host - расширение стандарта POSIX.1. Иными словами, нельзя использовать ut_host в переносимом коде, это поле в стандарт не входит.
     
  • 1.11, Анонимко, 13:03, 25/05/2010 [ответить] [смотреть все]  
  • +/
    printf( "%s\n", getenv("LOGNAME") );
     
     
  • 2.12, Анонимко, 13:04, 25/05/2010 [^] [ответить] [смотреть все]  
  • +/
    А понял, не о том речь. Пардоньте.
     
  • 1.13, pavlinux, 03:15, 05/06/2010 [ответить] [смотреть все]  
  • +/
    Дополнение code include stdio h include stdlib h include string h ... весь текст скрыт [показать]
     
     
  • 2.16, Аноним, 21:33, 05/09/2015 [^] [ответить] [смотреть все]  
  • +/
    Ну да, с тобой всё понятно, какир ... весь текст скрыт [показать]
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:



      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor