나는 이것을 조금 전에 인터넷 검색하고 몇 가지 방법을 발견했지만 Google이 모든 것을 알지 못한다고 생각합니다. 그렇다면 yo 어떻게 리눅스 박스에서 사용자를 쫓아 내나요? 또한 처음 로그인 한 것을 어떻게 알 수 있습니까? 그리고 관련 ... 사용자가 X11 DE에 로그인 한 경우 방법이 작동합니까?
아마도 더 쉬운 방법이 있지만, 나는 이것을합니다 :
컴퓨터에 누가 로그인했는지 확인-who
또는 w
사용 :
> who
mmrozek tty1 Aug 17 10:03
mmrozek pts/3 Aug 17 10:09 (:pts/2:S.0)
TTY가 연결된 쉘의 프로세스 ID를 찾으십시오.
> ps t
PID TTY STAT TIME COMMAND
30737 pts/3 Ss 0:00 zsh
연결이 끊어 질 때 웃으십시오 (이 단계는 선택 사항이지만 권장 됨).
> echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
해당 프로세스를 종료하십시오.
> kill -9 30737
방금 who
에 -u
깃발; PID는 오른쪽에있는 숫자입니다.
> who -u
mmrozek tty1 Aug 17 10:03 09:01 9250
mmrozek pts/18 Aug 17 10:09 01:46 19467 (:pts/2:S.0)
Micheal이 이미 지적했듯이 who
를 사용하여 로그인 한 사람을 찾을 수 있습니다. 그러나 프로세스가 여러 개인 경우 각 프로세스를 개별적으로 종료하는 것보다 더 편리한 방법이 있습니다. killall -u username
해당 사용자의 모든 프로세스를 종료합니다.
점!
나는 받아 들여진 대답의 유머에 감사하지만 전문적으로 나는 그것을 옹호 할 수 없다.
내가 아는 가장 우아한 방법은 셸에 -HUP을 보내서 사용자 끊기를 시뮬레이션하는 것입니다. 이 연결을 유휴 상태의 sshd로 보내 연결 손실을 시뮬레이트하여 전체 셸 환경 (하위 셸 포함)을 정리하거나 특정 중첩 된 셸 (예 : 연결이 끊긴 터미널 멀티플렉서 내부 설정)에 보낼 수 있습니다. 정말 정확하려면 파일 시스템 마운트 해제를 방지하십시오.
부팅하기 전에 write
를 사용하여 터미널 유휴 pty로 메시지 보내기 is 재미있는 취미.
사용자 'username'을 로그 아웃하십시오.
skill -KILL -u username
보다 man skill
다른 유용한 명령은 pkill
here pkill -u username && pkill -9 -u username
. killall
는 Solaris IIRC에서 완전히 다른 것을 의미한다는 단점이 있습니다. 또한 pkill
에는 약간 더 고급 옵션이 있습니다.
우선, 이것은 더 큰 문제를 나타냅니다. 시스템을 믿지 않는 사용자가 있다면, 레벨을 조정하고 이미지를 다시 만들어야합니다.
이를 염두에두고 다음 중 일부 또는 전부를 수행 할 수 있습니다.
# 환경 설정 $ BADUSER = foo # 여기서 foo는 문제의 사용자 이름입니다. $ USERLINE = $ (grep '^ $ {BADUSER} :'/ etc/passwd ) $ BADUID = $ (echo $ {USERLINE} | awk -F : '{print $ 3}') $ BADGID = $ (echo $ {USERLINE} | awk -F : '{ print $ 4} ') $ BADHOMEDIR = $ (echo $ {USERLINE} | awk -F :'{print $ 6} ') $ BDIR = "~/backup/home-backup /" $ TSTAMP = $ (날짜 + % F) $ TAR_FILENAME = "$ {BADUSER}-$ {TSTAMP} .tar.bz2" $ OWNED_FILENAME = "$ {BADUSER } -files-$ {TSTAMP} .txt " # 사용자의 향후 로그인 비활성화 $ Sudo chsh -s/bin/false"$ {BADUSER} " # 사용자 프로세스를 모두 종료 $ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}'| awk '{print $ 2}') $ Sudo kill -9 $ {BADPROCS} # 사용자의 홈 디렉토리 백업/삭제 $ mkdir -p $ {BDIR} $ Sudo tar -cfj $ {BDIR}/$ {TAR_FILENAME} $ {BADHOMEDIR} $ Sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR}/* # 모든 파일 찾기 사용자가 소유 함 [.__ __.] $ Sudo find/-user $ {BADUSER}> ~/backup/$ {OWNED_FILENAME} # 사용자 제거 $ Sudo userdel $ {BADUSER}
나는 모든 것을 둘러 보았고이 작업을 자동화하는 단일 스크립트를 찾을 수 없었습니다.
따라서 여기에 제안 된 솔루션을 기반으로 대화식 Bash 스크립트 의 모든 내용을 혼합하여 who -u
의 사용자 및 세션을 나열하여 사용자가 수행 할 작업을 선택할 수 있습니다.
그러면 다음 중 하나를 수행 할 수 있습니다.
killall -u <username> -HUP
kill <PID>
필요한 모든 정보는 who -u
에서 가져온 다음 mapfile
및 awk
를 사용하여 구문 분석됩니다.
나중에 write
를 사용하여 메시지를 보낼 가능성을 추가 할 것입니다 (프로세스가 지연됨).
kill -9
를 사용하여 특정 세션을 종료하는 옵션도 추가 할 것입니다. 그러나 나는 단지 kill
에 아무런 문제가 없었으며 다른 사람들이 지적했듯이 가능한 경우 kill -9
는 피해야합니다.
Github에서 코드를 확인하거나 자동화 된 방식으로 코드를 수행하는 방법에 대해 자세히 알아 보려면 다음 코드를 확인하십시오.
제 생각에는 killall -u username
귀하와 동일한 사용자 인 경우, 귀하는 귀하를 쫓아 낼 것입니다. kill
프로세스가 더 나은 솔루션이 될 것입니다.
그렇다면 어떻게 리눅스 박스에서 [양성] 사용자를 쫓아 내나요?
결국 사용자 ID에서 소유, 연관 또는 생성 된 프로세스를 식별하고 종료합니다. 최종 목표를 달성하기 위해 어떤 명령을 사용 하든지 반드시 도달하는 한 중요하지는 않습니다.
기본적으로 두 가지 대답 ...
Option A : 해당 사용자의 로그 아웃을 유발합니다. 따라서 이는 사용자가 소유하고 uid로 추적 할 수 있으며 실행중인 특정 Linux 배포판에 대한 일부 로그인 프로세스의 일부로 분류 된 프로세스를 식별하는 것을 의미합니다. "로그인"전에 SSH 또는 VNC와 같은 상위 프로세스가 있고 "로그인"후 GDM과 같은 하위 프로세스가 있다는 것을 인식하십시오. 일반적으로 상위 프로세스를 종료하면 하위 프로세스가 종료되지만 항상 그런 것은 아닙니다. 따라서 로그 아웃 후 더 이상 필요하지 않은 다른 프로세스를 종료하려고합니다. 이 모든 작업을 수행하면 백그라운드 작업이 계속 실행됩니다. 양성 사용자이므로 로그 아웃하고 싶을 수도 있습니다. 내가 아는 한, /usr/bin/w
및 /usr/bin/who
가 로그인 프로세스를 통과 한 사람을보고합니다.
option B : 특정 uid가 소유 한 모든 프로세스를 완전히 종료합니다. 이는 단순히 해당 사용자가 소유 한 모든 프로세스를 종료하는 것을 의미하며, 로그인되어 있으면 로그 아웃됩니다. 시스템에서 쫓아냅니다 . 그것은 간단한 ps -ef | grep <uid>
이면되고 모든 프로세스를 허용 가능한 방식으로 끝내야합니다.
sLES 11에서보고
man skill ...이 도구는 아마도 쓸모없고 이식 할 수 없습니다. 명령 구문이 잘못 정의되었습니다. killall, pkill 및 pgrep 명령을 대신 사용하십시오.
kill -9
FTW!