어떻게 시스템에서 양성 사용자를 쫓아 내나요? 방법을 발견했지만 Google이 모든 것을 알지 못한다고

나는 이것을 조금 전에 인터넷 검색하고 몇 가지 방법을 발견했지만 Google이 모든 것을 알지 못한다고 생각합니다. 그래서 어떻게 당신은 당신의 리눅스 박스 떨어져 사용자를 걷어차? 또한 처음 로그인 한 것을 어떻게 알 수 있습니까? 그리고 관련 … 사용자가 X11 DE에 로그인 한 경우 방법이 작동합니까?



답변

아마도 더 쉬운 방법이 있지만, 나는 이것을합니다 :

  1. 컴퓨터에 누가 로그인했는지 확인- who또는 w:

    > who
    mmrozek  tty1         Aug 17 10:03
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. TTY가 연결된 쉘의 프로세스 ID를 찾으십시오.

    > ps t
    PID   TTY      STAT   TIME COMMAND
    30737 pts/3    Ss     0:00 zsh
    
  3. 연결이 끊어 질 때 웃으십시오 (이 단계는 선택 사항이지만 권장 됨).

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. 해당 프로세스를 종료하십시오.

    > 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)


답변

Micheal이 이미 지적했듯이, who누가 로그인했는지 확인할 수 있습니다 . 그러나 프로세스가 여러 개인 경우 각 프로세스를 개별적으로 종료하는 것보다 더 편리한 방법이 있습니다 killall -u username. 해당 사용자가 모든 프로세스를 종료하는 데 사용할 수 있습니다 .


답변

점!

나는 받아 들여진 대답의 유머에 감사하지만 전문적으로 나는 그것을 옹호 할 수 없다.

내가 아는 가장 우아한 방법은 쉘에 -HUP을 보내서 사용자 끊기를 시뮬레이션하는 것입니다. 이것을 유휴 sshd로 보내면 연결이 끊어지는 것을 시뮬레이트하여 전체 셸 환경 (하위 셸 포함)의 정리를 트리거하거나 특정 중첩 셸 (예 : 연결이 끊긴 터미널 멀티플렉서 내부의 설정)에 보낼 수 있습니다. 정말로 정확하려면 파일 시스템 마운트 해제를 방지하십시오.

사용 write당신이 그들을 부팅하기 전에 말기 유휴 ptys에 메시지를 보내도록하는 것입니다 하지만 재미있는 취미.


답변

사용자 ‘username’을 로그 아웃하십시오.

skill -KILL -u username

보다 man skill


답변

다른 유용한 명령이 pkill여기 있습니다 pkill -u username && pkill -9 -u username.
killallSolaris 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에서 코드를 확인하거나 자동화 된 방식으로 코드를 수행하는 방법에 대해 자세히 알아 보려면 다음 코드를 확인하십시오.