나는 이것을 조금 전에 인터넷 검색하고 몇 가지 방법을 발견했지만 Google이 모든 것을 알지 못한다고 생각합니다. 그래서 어떻게 당신은 당신의 리눅스 박스 떨어져 사용자를 걷어차? 또한 처음 로그인 한 것을 어떻게 알 수 있습니까? 그리고 관련 ... 사용자가 X11 DE에 로그인 한 경우 방법이 작동합니까?
나는 이것을 조금 전에 인터넷 검색하고 몇 가지 방법을 발견했지만 Google이 모든 것을 알지 못한다고 생각합니다. 그래서 어떻게 당신은 당신의 리눅스 박스 떨어져 사용자를 걷어차? 또한 처음 로그인 한 것을 어떻게 알 수 있습니까? 그리고 관련 ... 사용자가 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
하여 1 단계와 2 단계를 결합 할 수 있음을 발견했습니다 -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)
kill -9
응? 당신은 정말로 이것에 BOFH 모드에 있습니다.
kill -9
, 그리고 온화한 신호로 시작 하는 대신,하지만 난 너무 많은 문제가되지 않습니다 이러한 맥락에서 가정합니다. 사람들이 농담을 그리워 할 경우에 대비하여 의견을 남기려고합니다.
Micheal이 이미 지적했듯이, who
누가 로그인했는지 확인할 수 있습니다 . 그러나 프로세스가 여러 개인 경우 각 프로세스를 개별적으로 종료하는 것보다 더 편리한 방법이 있습니다 killall -u username
. 해당 사용자가 모든 프로세스를 종료하는 데 사용할 수 있습니다 .
killall
죽이는 것 이상의 쉘이 있기 때문에 그래픽 환경에서는 사용 이 약간 더 적합합니다.
점!
나는 받아 들여진 대답의 유머에 감사하지만 전문적으로 나는 그것을 옹호 할 수 없다.
내가 아는 가장 우아한 방법은 쉘에 -HUP을 보내서 사용자 끊기를 시뮬레이션하는 것입니다. 이것을 유휴 sshd로 보내면 연결이 끊어지는 것을 시뮬레이트하여 전체 셸 환경 (하위 셸 포함)의 정리를 트리거하거나 특정 중첩 셸 (예 : 연결이 끊긴 터미널 멀티플렉서 내부의 설정)에 보낼 수 있습니다. 정말로 정확하려면 파일 시스템 마운트 해제를 방지하십시오.
사용 write
당신이 그들을 부팅하기 전에 말기 유휴 ptys에 메시지를 보내도록하는 것입니다 하지만 재미있는 취미.
echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP
(잠은 사용자에게 저장하고 로그 오프 할 수있는 기회를 제공합니다,하지만 당신은 아마 단지 어쨌든 로그 오프하는 것을 잊었다 사용자에이를 사용)
사용자 'username'을 로그 아웃하십시오.
skill -KILL -u username
보다 man skill
다른 유용한 명령이 pkill
여기 있습니다 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}
you have users that you don't trust on your system
... 또는 다른 사람에게 메시지로 하나를 죽이는 것일 수도 있습니다. 결국, sysadmin의 신조는 "사랑받는 것보다 두려워하는 것이 낫다"는 것이 아닙니까? 모든 농담을 제쳐두고 Machiavelli는 O'Reilly 책을 써야합니다.
나는 모든 것을 둘러 보았고이 작업을 자동화하는 단일 스크립트를 찾을 수 없었습니다.
따라서 여기에 제안 된 솔루션을 기반으로 대화 형 Bash 스크립트에 모든 것을 혼합 who -u
하여 사용자가 수행 할 작업을 선택할 수 있는 사용자와 세션을 나열했습니다 .
그러면 다음 중 하나를 수행 할 수 있습니다.
killall -u <username> -HUP
kill <PID>
모든 필요한 정보는에서 제공 who -u
한 후 사용하여 구문 분석 mapfile
하고 awk
.
write
나중에 사용하여 메시지를 보낼 수있는 가능성을 추가 할 것입니다 (프로세스가 지연됨).
아마와 함께 특정 세션을 죽일 수있는 옵션이 추가됩니다 kill -9
뿐만 아니라입니다. 그러나 나는 kill
다른 사람들이 지적한대로 문제가 없었으며 kill -9
가능하면 피해야합니다.
github에서 코드를 확인하거나 자동화 된 방식으로 코드를 수행하는 방법에 대해 자세히 알아 보려면 다음 코드를 확인하십시오.
그렇다면 어떻게 리눅스 박스에서 [양성] 사용자를 쫓아 내나요?
결국 사용자 ID에서 소유, 연관 또는 생성 된 프로세스를 식별하고 종료합니다. 최종 목표를 달성하기 위해 어떤 명령을 사용 하든지 반드시 도달하는 한 중요하지는 않습니다.
기본적으로 두 가지 답변 ...
옵션 A : 사용자의 로그 아웃을 유발하는 로그인 따라서 이는 사용자가 소유하고 uid로 추적 할 수 있으며 실행중인 특정 Linux 배포판에 대한 일부 로그인 프로세스의 일부로 분류 된 프로세스를 식별하는 것을 의미합니다. "로그인"전에 SSH 또는 VNC와 같은 상위 프로세스가 있고 "로그인"후 GDM과 같은 하위 프로세스가 있다는 것을 인식하십시오. 일반적으로 상위 프로세스를 종료하면 하위 프로세스가 종료되지만 항상 그런 것은 아닙니다. 따라서 로그 아웃 후에 더 이상 필요하지 않은 다른 프로세스를 종료하려고합니다. 이 모든 작업을 수행하면 백그라운드 작업이 계속 실행됩니다. 양성 사용자이므로 로그 아웃하고 싶을 수도 있습니다. 마찬가지로 지금까지 내가 알고,로 /usr/bin/w
와 /usr/bin/who
과정에서 로그를 통과 한 사람보고합니다.
옵션 B : 특정 uid가 소유 한 모든 프로세스를 완전히 종료합니다. 이는 단순히 해당 사용자가 소유 한 모든 프로세스를 종료하는 것을 의미합니다. 이는 로그인 한 경우에도 로그 아웃됩니다. 이는 시스템 에서 시작되는 것을 만족시킵니다 . 그것은 간단해야하며 ps -ef | grep <uid>
허용 가능한 모든 방식으로 모든 프로세스를 종료해야합니다.
SLES 11에서보고
man skill ...이 도구는 아마도 쓸모없고 이식 할 수 없습니다. 명령 구문이 잘못 정의되었습니다. killall, pkill 및 pgrep 명령을 대신 사용하십시오.
kill -9
FTW!
내 의견으로는 killall -u username
, 당신과 같은 사용자라면, 당신은 자신을 시작 하기 때문에 사용하는 것이 실제로 유용하지 않습니다 . 따라서 kill
프로세스가 더 나은 솔루션이 될 것입니다.
who(1)
또는 무언가에 의해 발견되지 않게 할 것w(1)
입니다. 설치 될 수있는 잠재적 루트킷을 제거 할 수있는 유일한 방법은 시스템을 완전히 지우고 다시 설치하는 것입니다.