Как завершить все сеансы пользователя Linux, кроме первого, и ограничить пользователей одним сеансом входа

Как завершить все сеансы пользователя Linux, кроме первого, и ограничить пользователей одним сеансом входа

Мне нужно знать, как завершить все процессы вошедшего в систему пользователя, кроме первого, в Linux RedHat 6.

например, AZainпользователь входит в систему несколько раз с разных машин, поэтому мне нужно разрешить только первый процесс и завершить все остальные для этого пользователя:

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)

Редактировать: Я пытаюсь сделать это, поскольку у меня есть приложение, которое потребляет лицензии для пользователей. Поэтому каждый новый сеанс для того же пользователя будет потреблять больше лицензий. Если бы я мог предотвратить любые новые входы для того же пользователя, это было бы здорово.

решение1

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

Лучшим решением будет:

  • Переименуйте программу, например из /usr/local/bin/fooв/usr/local/bin/foo.real

  • Напишите скрипт-оболочку с тем же именем и путем, что и у исходной программы (например, /usr/local/bin/foo), чтобы проверить, запускает ли ее уже пользователь.

    Если да, то выход с соответствующим сообщением об ошибке. Если нет, то запуск исходной программы ( /usr/local/bin/foo.real)

Очень простой пример:

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

Примечание: Это работает для благопристойных пользователей, которые понимают проблему лицензирования и не против следовать правилам. Это не остановит хитрого пользователя от запуска foo.realсебя. Вы можете остановить хитрых, но не очень умных пользователей, добавив alias foo.real=fooк /etc/profileили /etc/bash.bashrc.

Вы можете запустить задание root cron, которое обнаружит экземпляры, foo.realзапущенные без скрипта оболочки, называемого fooродительским процессом. Задание cron может завершить любые такие экземпляры и/или отправить вам предупреждение (чтобы избежать спама, отслеживайте идентификаторы процессов для foo.real и не отправляйте себе несколько предупреждений об одном и том же PID).


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

Связанный контент