Chấm dứt các phiên SSH bị hủy


47

Các phiên SSH của tôi dường như giảm xuống mặc dù đó không phải là vấn đề chính của tôi - vấn đề chính là các phiên trước của tôi vẫn còn tồn tại, tệ hơn nữa là một trong số chúng đang chạy visudokhiến tôi không thể truy cập được!

who hiển thị một số phiên tất cả ngoại trừ phiên hiện tại mà tôi biết đã bị ngắt kết nối, làm cách nào tôi có thể chấm dứt các phiên cũ để giải phóng tài nguyên của chúng?


1
Nếu bạn ổn với việc giết tất cả mọi thứ trên một thiết bị đầu cuối cụ thể, bạn có thể làm điều gì đó như fuser -k /dev/pts/0hoặc bất kỳ thiết bị đầu cuối nào hiển thị trong whođầu ra. Một chút kỳ lạ tất cả những người bỏ qua SIGHUP, mặc dù. Họ đã chạy trong một screenphiên hay cái gì đó?
Bratchley

Tôi nhận được: Không thể giết quá trình 1031: Không có quy trình như vậy. Không có gì đặc biệt khi SSH sử dụng PuTTY - Tôi nghĩ rằng bộ định tuyến mới của tôi rất tích cực trong việc loại bỏ các kết nối không hoạt động - mặc dù tôi đã nghĩ rằng đầu bên kia sẽ làm gì đó khi kết nối TCP chấm dứt - có lẽ nó chưa biết (chưa)?
markmnl

1
CẬP NHẬT lệnh đó đang hoạt động cho những người dùng khác (0 không whocòn nữa), cảm ơn!
markmnl

"Các phiên SSH của tôi dường như đang giảm mặc dù ... vấn đề chính là các phiên trước của tôi vẫn còn tồn tại" có một chút mâu thuẫn. Họ đã bị ngắt kết nối hoặc họ vẫn được kết nối. Có lẽ bạn nên giải thích làm thế nào bạn đạt được kết luận này sao cho bạn bị ngắt kết nối sau đó kết nối lại và nhận ra kết nối cũ của bạn vẫn đang chạy.
goldilocks

Câu trả lời:


58

Để giải quyết vấn đề tức thời, tệp sudoers bị khóa, bạn chỉ cần xóa tệp khóa. Nó thường sẽ là `/etc/sudoers.tmp"; kiểm tra trang man để xác minh. Nếu bạn xóa tệp khóa, bạn có thể chạy lại visudo.

Để xóa tất cả các phiên vẫn bị treo, trước tiên hãy tìm hiểu thông tin về phiên hiện tại của bạn. Sau đó, nếu pid của riêng bạn là 12345, hãy làm

ps -ef | grep sshd | grep -v root | grep -v 12345 | grep -v grep | awk '{print "sudo kill -9", $2}' |sh 

Bạn có thể muốn làm điều đó mà không có | shlần cuối cùng chỉ để kiểm tra các PID mà bạn dự định giết.

Nếu bạn đang dùng Linux, thay vào đó bạn có thể sử dụng

pkill -o -u YOURUSERNAME sshd

để giết phiên SSH cũ nhất của bạn. Tiếp tục làm điều đó cho đến khi phiên hiện tại của bạn là duy nhất còn lại.

Bạn cũng có thể muốn đặt ServerAliveInterval 15ở của bạn .ssh/configđể gửi một thông điệp keepalive mỗi 15 giây khi không có dữ liệu đã được gửi đi. man ssh_configđể biết thêm thông tin.


1
Trên CentOS - Nếu bạn đang SSH vào tài khoản root, câu trả lời này sẽ không hoạt động, hãy thử sử dụng các cách sau: ps aux | grep ssh | grep -v / usr / sbin | awk '{in $ 2}' | giết xargs
Ali Nadalizadeh

Cảm ơn. Những công việc này. Tôi không rõ mục đích grep -v 12345của một phần của cú pháp là gì? vượt qua tất cả những gì không chứa 12345?
Chúa ơi.

grep -v 12345có nghĩa là "loại bỏ bất kỳ dòng phù hợp 12345từ trận đấu". Do đó, trước tiên bạn nên xác định PID của phiên của riêng bạn và sử dụng PID đó thay vì 12345.
Jenny D

Sau khi giết tất cả các phiên như vậy và từ chức, các lệnh whohoặc topvẫn hiển thị số lượng người dùng đã ký cũ, thậm chí nó chỉ hiển thị 1. Làm thế nào điều đó có thể bị buộc phải được làm mới?
Ωmega

2

Nếu bạn liệt kê các quy trình để bạn thấy lệnh và đối số của chúng (ví dụ như ps -ftừ Procps), bạn sẽ thấy các quy trình sshd được gọi là eg:

sshd: user@pts/7

Thiết bị đầu cuối ( pts/7) là phần quan trọng ở đây - nếu bạn so sánh nó với thiết bị đầu cuối hiện tại ( tty), bạn có thể xem đó là phiên hoạt động của bạn. Tất nhiên có nhiều cách khác để làm điều đó (như nhìn vào PID của shell hiện đang chạy và định vị cái đó trong cây quy trình), nhưng đây có thể là cách dễ nhất. Sau đó, bạn có thể sử dụng một cái gì đó dọc theo những dòng này:

# current tty name
TTY=$(tty | cut -f3- -d/)
# PIDs of other sshd processes
ps -o pid= -o command= -C sshd \
    | grep sshd:.*@ \
    | grep -v "@$TTY" \
    | sed "s/ sshd.*//"

Sau đó, bạn có thể cung cấp các bộ lọc để tiêu diệt xargsnhưng luôn đảm bảo rằng bạn không giết sshdquy trình chính xử lý các kết nối mới .

Trên một lưu ý liên quan, lưu ý rằng psđầu ra phân tích cú pháp khá dễ bị lỗi (đặc biệt là trên các hệ thống khác nhau) do sự thay đổi của các định dạng đầu ra của nó (ở đây được giảm thiểu ở mức độ lớn khi sử dụng -o pid= -o command=).


1

Điều này sẽ giết phiên treo trong hơn 2 ngày. Nó có thể được đặt như một cron.

for i in `w|awk '{print $2,$5}'|grep days|cut -d' ' -f1`; do fuser -k /dev/$i; done

Điều này sẽ giết tất cả trừ (phiên hoạt động cuối cùng) của bạn. Chạy này từ thiết bị đầu cuối.

for i in `w|tail -n+3|awk '{print $2,$5}'|grep -v 0.00s|cut -d' ' -f1`; do fuser -k /dev/$i; done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.