저는 사용자가 시스템에 로그인할 때(모든 유형의 로그인 포함) 몇 가지 명령을 실행해야 하는 작은 데몬을 개발 중입니다. 이를 위해 이 로그인 이벤트가 발생할 때마다 프로그램을 깨우고 싶습니다. 그러나 새 사용자가 도착했는지 주기적으로 확인하는 것을 원하지 않습니다. 즉, 다음을 수행할 수 없습니다.
/var/log/auth.log
로그 파일 등을 주기적으로 읽습니다. 실제로 파일을 구문 분석해야 한다는 사실 외에도 이 작업을 꽤 자주 수행할 것입니다(시스템에 로그인한 사람이 거의 없기 때문에).ps
who
다른 명령(예: 또는 ) 의 출력을 확인w
하고 내부적으로 사용자를 추적합니다. 이 접근 방식을 사용하면 프로그램이놓치다내 프로그램이 출력 확인을 실행하기 전에 누군가 로그인 및 로그아웃하는 경우를 대비한 일부 로그인입니다.
프로그램이 시간을 낭비하는 것을 원하지 않기 때문에 I/O 이벤트를 사용하려고 생각했지만... 어디로 가야할지 잘 모르겠습니다.훅. 모니터링 /var/run/utmp
(을 사용하여 )을 시도했지만 inotify
제대로 반응하지 않는 것 같습니다. 터미널이 열리거나 닫힐 때 내 프로그램이 많은 이벤트를 수신하지만 누군가 실제로 로그인할 때는 매우 적은 이벤트를 수신합니다. 또한 이러한 이벤트는 한 번의 로그인 시도에서 다른 로그인 시도로 식별하고 변경하기가 어렵습니다. 참고로 제가 할 수 있었던 일 중 일부는 다음과 같습니다.잡다런타임 su user
:
- 터미널이 열려 있을 때: (
IN_OPEN
파일이 열려 있음),IN_CLOSE_NOWRITE
(쓰기 불가능한 파일이 닫혀 있음), 때로는IN_ACCESS
(파일에 액세스됨, 사용됨su -l
). - 시작 시기
su
(비밀번호 프롬프트): 식별자가 없는 일부 이벤트(event.mask = 0
). - 성공적인 로그인 시도 후(쉘이 다른 사용자로 시작됨): 아무것도 없습니다.
- 터미널을 닫을 때: 이름이 지정되지 않은 또 다른 이벤트 집합입니다.
프로그램을 "사용자 로그인inotify
" (프로세스 생성을 감지하기 위해 watch를 사용할 수 있는 것처럼 ) watch를 사용할 수 있는 사용자 로그인을 반영하는 파일이 있습니까 /proc
? 내용을 다시 살펴봤지만 /proc
필요한 것이 아무것도 없는 것 같습니다.
사이드 노트: 프로그래밍과 관련된 내용이라 Stack Overflow에 올려볼까도 생각했지만, 구현보다는 사용자가 로그인할 때 Linux 시스템의 "가시적" 반응에 더 관심이 갑니다. ) 시간 낭비 없이 프로그래밍 방식으로 관찰/감지/알려줍니다.
답변1
시스템에서 PAM(Pluggable Authentication Module)을 사용합니까? 가장 현대적인리눅스또는BSDPAM을 사용하세요.
PAM을 사용하면 연결된 로그인이 가능합니다. 귀하의 요구 사항을 충족할 수 있는 여러 가지 PAM 모듈이 있습니다. 또는 C로 직접 작성할 수도 있습니다.pam-python* Python 코드에 연결할 수 있는 바인딩입니다.
데몬이 지속적으로 실행되기를 원한다는 점을 고려하여 파일에 기록하고 데몬에 신호를 보내는 간단한 PAM 모듈을 선택하겠습니다.
*libpam-python
이 패키지는 Debian과 Ubuntu의 이름을 따서 명명되었습니다.
답변2
충분히 교활하고 교활한 사용자는 이를 물리칠 수 있지만 /etc/profile
데몬에게 알리는 명령을 입력하면 대부분의 로그인을 캡처할 수 있습니다. who am i
런타임 시 데몬이 읽을 FIFO로 출력을 리디렉션하는 것만큼 간단할 수 있습니다 .