Como matar todas as sessões de um usuário Linux, exceto a primeira, e limitar os usuários a uma sessão de login

1

Eu preciso saber como matar todos os processos para um usuário logado, exceto o primeiro no Linux redhat 6.

por exemplo, AZain usuário é logado várias vezes a partir de máquinas diferentes, então eu preciso permitir apenas o primeiro processo e matar todos os outros para este usuário:

who -u
AZain    pts/2        2016-06-23 08:34   .         27191 (localhost)
AZain    pts/4        2016-06-23 09:01   .         28885 (localhost)
root     pts/0        2016-06-23 08:14   .         25962 (10.11.155.23)
AZain    pts/1        2016-06-23 08:34 00:27       27169 (10.11.155.23)
AZain    pts/3        2016-06-23 09:01   .         28867 (10.11.155.14)

Editar: Estou tentando fazer isso porque estou tendo um aplicativo em que consome licenças para os usuários. Assim, toda nova sessão para o mesmo usuário consumiria mais licenças. Se eu pudesse impedir novos logins para o mesmo usuário, isso seria ótimo.

    
por Ahmed Zein 23.06.2016 / 08:37

1 resposta

0

Este é um Problema XY clássico - você está tentando limitar o número de instâncias de softwares licenciados sendo executados por usuário, mas você está focado na limitação de logins de shell. Este é o problema errado para resolver.

Uma solução melhor é:

  • Renomeie o programa, por exemplo de /usr/local/bin/foo a /usr/local/bin/foo.real

  • Escreva um script de wrapper com o mesmo nome e caminho do programa original (por exemplo, /usr/local/bin/foo ) para verificar se o usuário já o está executando.

    Se sim, saia com uma mensagem de erro apropriada. Caso contrário, execute o programa original ( /usr/local/bin/foo.real )

Um exemplo muito simples:

#! /bin/sh

if pgrep -u "$USER" foo.real >/dev/null 2>&1 ; then
  echo "You are already running foo" >&2
  exit 1
else
  foo.real
fi

Observação: isso funciona para usuários bem comportados que entendem o problema de licenciamento e não se importam de seguir as regras. Isso não impedirá que um usuário sorrateiro execute foo.real . Você pode parar usuários furtivos, mas não muito inteligentes, adicionando alias foo.real=foo a /etc/profile ou /etc/bash.bashrc .

Você poderia executar uma tarefa cron do root que detectasse instâncias de foo.real em execução que não tivessem um script de shell chamado foo como o processo pai. O cron job poderia matar qualquer uma dessas instâncias e / ou enviá-lo por e-mail (para evitar spam, controle os IDs do processo para foo.real e não envie vários avisos sobre o mesmo PID).

BTW, se seu software licenciado vier com algum tipo de gerenciador de licenças, verifique sua documentação para ver se ele pode restringir o número de instâncias por usuário.

    
por 24.06.2016 / 07:00

Tags