Como posso detectar um login de usuário programaticamente? [duplicado]

5

Estou desenvolvendo um pequeno programa daemon que precisa executar algumas instruções quando um usuário se conecta ao sistema (todos os tipos de logins incluídos). Para fazer isso, quero que meu programa seja ativado sempre que ocorrer esse evento de login. No entanto, não quero verificar periodicamente se um novo usuário chegou, o que significa que não deve:

  • Leia arquivos de log como /var/log/auth.log periodicamente. Além do fato de que eu teria que realmente analisar o arquivo, eu provavelmente também faria isso com muita frequência (já que há muito poucos logins no meu sistema).
  • Verifique a saída de outro comando, como ps , who ou w , e acompanhe os usuários internamente. Usando este método, o programa poderia perder alguns logins, no caso de alguém entrar e sair antes que meu programa execute suas verificações na saída.

Como não quero que meu programa perca tempo, pensei em usar eventos de E / S, no entanto ... não vejo bem onde ligar . Eu tentei assistir /var/run/utmp (usando inotify ), mas parece que não reage corretamente: meu programa recebe muitos eventos quando os terminais são abertos / fechados, mas muito poucos quando alguém realmente faz login (se algum deles todos). Além disso, esses eventos dificilmente são reconhecíveis e mudam de uma tentativa de login para outra. Para o registro, aqui está um pequeno conjunto do que eu consegui pegar ao executar su user :

  • Quando um terminal é aberto: IN_OPEN (o arquivo foi aberto), IN_CLOSE_NOWRITE (arquivo não-gravável fechado), às vezes IN_ACCESS (o arquivo foi acessado, quando foi usado su -l ).
  • Quando su é iniciado (solicitação de senha): alguns eventos sem identificador ( event.mask = 0 ).
  • Após uma tentativa de login bem-sucedida (shell iniciado como outro usuário): nada.
  • Ao fechar o terminal: outro conjunto de eventos sem nome.

Existe outra maneira de ligar um programa a " logins de usuários "? Existe um arquivo refletindo logins de usuários no qual eu poderia usar um inotify watch (assim como eu poderia usar um em /proc para detectar criações de processo)? Eu tive outro olhar para /proc conteúdo, mas nada parece ser o que eu preciso.

Side note : Eu pensei em postar isso no Stack Overflow já que ele é relacionado a programação, mas além da implementação, eu estou mais interessado nas reações "visíveis" que um sistema Linux tem quando um usuário efetua login (por "visível", quero dizer, reações que pudemos observar / detectar / observar, programaticamente, sem perder tempo).

    
por John WH Smith 17.10.2014 / 22:38

2 respostas

7

O seu sistema usa Módulos de autenticação conectáveis (PAM, Pluggable Authentication Modules)? O mais moderno Linux ou BSD usa o PAM.

O PAM permite que você conecte-se a logins. Há uma variedade de módulos PAM disponíveis que podem atender às suas necessidades, ou você pode escrever seus próprios em C. Existe até um pam-python * binding que permite conectar em código Python.

Dado que você deseja que o daemon seja executado continuamente, eu optaria por um módulo PAM simples que registra em um arquivo e sinaliza o daemon.

* O pacote é denominado libpam-python no Debian e no Ubuntu.

    
por 17.10.2014 / 22:51
2

Pode ser possível para um usuário suficientemente habilidoso / desonesto derrotar isso, mas você deve ser capaz de capturar a maioria dos logins se você colocar um comando em /etc/profile para notificar seu daemon. Pode ser algo simples, como executar who am i com saída redirecionada para um fifo que seu daemon leria.

    
por 17.10.2014 / 23:24