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

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

Preciso saber como eliminar todos os processos de um usuário logado, exceto o primeiro no linux redhat 6.

por exemplo, AZaino usuário está logado várias vezes em máquinas diferentes, então preciso permitir apenas o primeiro processo e eliminar 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 tenho um aplicativo que consome licenças para usuários. Assim, cada nova sessão para o mesmo usuário consumiria mais licença. Se eu pudesse impedir novos logins para o mesmo usuário, seria ótimo.

Responder1

Este é um clássicoProblema XY- você está tentando limitar o número de instâncias de software licenciado em execução por usuário, mas está focado em limitar logins de shell. Este é o problema errado para resolver.

Uma solução melhor é:

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

  • Escreva um script 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 a questão do licenciamento e não se importam em seguir as regras. Isso não impedirá que um usuário sorrateiro foo.realse execute. Você pode impedir usuários sorrateiros, mas não muito inteligentes, alias foo.real=fooadicionando /etc/profileou /etc/bash.bashrc.

Você pode executar um cron job raiz que detectou instâncias em foo.realexecução que não tinham um script de shell chamado foocomo processo pai. O cron job pode eliminar essas instâncias e/ou enviar um aviso por e-mail (para evitar spam, acompanhe os IDs do processo para foo.real e não envie vários avisos sobre o mesmo PID).


Aliás, se o 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.

informação relacionada