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.

실행 중인 인스턴스에 상위 프로세스라는 쉘 스크립트가 foo.real없음 을 감지하는 루트 크론 작업을 실행할 수 있습니다 . foo크론 작업은 그러한 인스턴스를 종료하거나 이메일을 통해 경고를 보낼 수 있습니다(스팸을 피하려면 foo.real의 프로세스 ID를 추적하고 동일한 PID에 대해 여러 경고를 이메일로 보내지 마십시오).


그런데 라이선스가 부여된 소프트웨어가 일종의 라이선스 관리자와 함께 제공되는 경우 설명서를 확인하여 사용자당 인스턴스 수를 제한할 수 있는지 확인하세요.

관련 정보