it-swarm-vi.com

Làm thế nào để bạn đá một người dùng lành tính ra khỏi hệ thống của bạn?

Tôi đã googling điều này một chút trước đây và nhận thấy một số cách, nhưng tôi đoán rằng google không biết tất cả. Vậy làm thế nào để bạn loại bỏ người dùng khỏi hộp Linux của bạn? Ngoài ra, làm thế nào để bạn nhìn thấy họ đang đăng nhập ở nơi đầu tiên? và có liên quan ... phương thức của bạn có hoạt động không nếu người dùng đăng nhập vào X11 DE (không phải là yêu cầu tôi chỉ tò mò)?

68
xenoterracide

Có lẽ có một cách dễ dàng hơn, nhưng tôi làm điều này:

  1. Xem ai đã đăng nhập vào máy của bạn - sử dụng who hoặc w:

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. Tra cứu ID tiến trình của Shell TTY của họ được kết nối với:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. Cười vào sự ngắt kết nối sắp xảy ra của họ (bước này là tùy chọn, nhưng được khuyến khích)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. Giết quá trình tương ứng:

    > kill -9 30737
    

Tôi vừa phát hiện ra bạn có thể kết hợp các bước 1 và 2 bằng cách cho who the -u cờ; PID là số tắt ở bên phải:

> 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)
147
Michael Mrozek

Như Micheal đã chỉ ra, bạn có thể sử dụng who để tìm ra ai đã đăng nhập. Tuy nhiên, nếu họ có nhiều quy trình, có một cách thuận tiện hơn là giết từng quy trình một cách riêng lẻ: bạn có thể sử dụng killall -u username để giết tất cả các quy trình bởi người dùng đó.

33
sepp2k

Necromancy!

Tôi đánh giá cao sự hài hước của câu trả lời được chấp nhận, nhưng về mặt chuyên môn tôi không thể ủng hộ nó.

Phương pháp duyên dáng nhất mà tôi biết là gửi một -HUP đến Shell để mô phỏng việc treo máy của người dùng. Bạn có thể gửi nó tới sshd nhàn rỗi của người dùng để mô phỏng kết nối của họ bị mất, điều này sẽ kích hoạt việc dọn sạch toàn bộ môi trường Shell (bao gồm cả vỏ con) hoặc gửi nó đến các vỏ được lồng cụ thể (giả sử, các thiết lập bên trong bộ ghép kênh đầu cuối bị ngắt kết nối đang ngăn bạn ngắt kết nối một hệ thống tập tin) nếu bạn muốn thực sự chính xác.

Sử dụng write để gửi tin nhắn đến các ptys nhàn rỗi cuối cùng trước khi bạn khởi động chúng is mặc dù đó là một sở thích thú vị.

23
Andrew B

Thoát khỏi tên người dùng 'tên người dùng':

skill -KILL -u username

Xem man skill

13
bsd

Lệnh hữu ích khác là pkill here pkill -u username && pkill -9 -u username. killall có nhược điểm là trên Solaris IIRC, nó có nghĩa là một cái gì đó hoàn toàn khác - cũng pkill có các tùy chọn nâng cao hơn một chút.

11
Maciej Piechotka

Trước hết, điều này cho thấy một vấn đề lớn hơn. Nếu bạn có người dùng mà bạn không tin tưởng vào hệ thống của mình, có lẽ bạn nên cấp nó và hình ảnh lại.

Với ý nghĩ đó, bạn có thể thực hiện một số hoặc tất cả những điều sau đây:

[.__.] # thiết lập môi trường [.__.] $ BADUSER = foo # trong đó foo là tên người dùng trong câu hỏi [.__.] $ USERLINE = $ (grep '^ $ {BADUSER}:'/etc/passwd ) [.__.] $ BADUID = $ (echo $ {USERLINE} | awk -F: '{print $ 3}') [.__.] $ BADGID = $ (echo $ {USERLINE} | awk -F: '{ in $ 4} ') [.__.] $ BADHOMEDIR = $ (echo $ {USERLINE} | awk -F:' {print $ 6} ') [.__.] $ BDIR = "~/backup/home-backup /" [.__.] $ TSTAMP = $ (ngày +% F) [.__.] $ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2" [.__.] $ OWNED_FILENAME = "$ {BADUSER } -files - $ {TSTAMP} .txt "[.__.] [.__.] # vô hiệu hóa thông tin đăng nhập trong tương lai của người dùng [.__.] $ Sudo chsh -s/bin/false" $ {BADUSER} "[.___ .] [.__.] # kill tất cả các quy trình của người dùng [.__.] $ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{print $ 2}') [.__.] $ Giết Sudo -9 $ {BADPROCS} [.__.] [.__.] # Sao lưu/xóa thư mục nhà của người dùng [.__.] $ Mkdir -p $ {BDIR} [.__.] $ Sudo tar -cfj $ {BDIR}/$ {TAR_FILENAME} $ {BADHOMEDIR} [.__.] $ Sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR}/* [.__.] [.__.] thuộc sở hữu của người dùng [.__ __.] $ Sudo find/-user $ {BADUSER}> ~/backup/$ {OWNED_FILENAME} [.__.] [.__.] # Xóa người dùng [.__.] $ Sudo userdel $ {BADUSER} [.___ .]
3
cjac

Tôi nhìn xung quanh và không thể tìm thấy một tập lệnh nào để tự động hóa tác vụ này.

Vì vậy, dựa trên các giải pháp được đề xuất ở đây, tôi đã trộn lẫn mọi thứ trong tập lệnh Bash tương tác liệt kê người dùng và phiên từ who -u để người dùng chọn làm gì.

Sau đó, bạn có thể:

  • giết tất cả các phiên cho người dùng killall -u <username> -HUP
  • giết một phiên cụ thể kill <PID>

Tất cả các thông tin cần thiết đến từ who -u và sau đó được phân tích cú pháp bằng cách sử dụng mapfileawk.

Tôi sẽ thêm khả năng gửi tin nhắn bằng cách sử dụng write sau (làm chậm quá trình).

Tôi có thể sẽ thêm tùy chọn để giết một phiên cụ thể với kill -9 cũng. Nhưng tôi không gặp vấn đề gì với chỉ kill và như được chỉ ra bởi những người khác, kill -9 nên tránh nếu có thể.

Bạn có thể kiểm tra mã trên github nếu bạn muốn dùng thử hoặc tìm hiểu thêm về cách tôi đang thực hiện theo cách tự động:

0
Gus Neves

Theo tôi, nó không thực sự hữu ích khi sử dụng killall -u username bởi vì nếu đó là cùng một người dùng với bạn, bạn sẽ tự đá mình. Vì vậy, kill quá trình sẽ là một giải pháp tốt hơn.

0
Mailo

Vậy làm thế nào để bạn loại bỏ người dùng [lành tính] khỏi hộp Linux của bạn?

Cuối cùng, việc xác định và kết thúc các quá trình được sở hữu, liên kết hoặc sinh ra từ id người dùng. Bất cứ lệnh nào bạn sử dụng để đạt được mục tiêu cuối cùng đó không nhất thiết phải miễn là bạn đạt được điều đó.

Về cơ bản hai câu trả lời ...

Tùy chọn A : gây ra đăng xuất của người dùng đã nói, trong đó bao giờ và tuy nhiên nhiều thông tin đăng nhập họ có. Vì vậy, điều này có nghĩa là xác định các quy trình thuộc sở hữu của người dùng, có thể theo dõi bởi uid và được phân loại là một phần của quy trình đăng nhập cho bản phân phối linux đã cho mà bạn đang chạy. Nhận ra có các quy trình cha mẹ như SSH hoặc VNC trước khi "đăng nhập" và các quy trình con như GDM sau khi "đăng nhập" Thông thường việc giết một quy trình cha mẹ sẽ giết chết quy trình con, nhưng không phải lúc nào cũng vậy. Vì vậy, bạn sẽ muốn giết các quá trình khác mà rõ ràng là không còn cần thiết sau khi đăng xuất. Khi thực hiện tất cả điều này, điều này sẽ giữ cho các công việc nền chạy ... bởi vì đó là một người dùng lành tính và có lẽ bạn chỉ muốn đăng xuất chúng. Theo như tôi biết, /usr/bin/w/usr/bin/who sẽ báo cáo người đã qua quy trình đăng nhập.

tùy chọn B : kết thúc hoàn toàn tất cả các quy trình thuộc sở hữu của một uid cụ thể, điều đó đơn giản có nghĩa là giết bất kỳ và tất cả các quy trình thuộc sở hữu của người dùng đã nói, điều này cũng sẽ đăng xuất chúng nếu chúng được đăng nhập. Điều này sẽ thỏa mãn đá chúng ra khỏi hệ thống . Điều đó chỉ cần đơn giản là ps -ef | grep <uid> và sau đó kết thúc tất cả các quy trình theo bất kỳ cách nào được chấp nhận.

fwiw trong SLES 11 nó báo cáo

kỹ năng của con người ... Những công cụ này có lẽ đã lỗi thời và không thể truy cập được. Cú pháp lệnh được xác định kém. Thay vào đó, hãy xem xét sử dụng các lệnh killall, pkill và pgrep.

kill -9 FTW!

0
ron