Hentikan sesi SSH yang hilang

47

Sesi SSH saya tampaknya menurun meskipun itu bukan masalah utama saya - masalah utama adalah sesi saya sebelumnya masih hidup, lebih buruk lagi salah satu dari mereka berjalan visudomencegah saya mengaksesnya!

who menunjukkan sejumlah sesi semua kecuali sesi saya saat ini yang saya tahu telah terputus, bagaimana saya bisa mengakhiri yang lama sehingga melepaskan sumber dayanya?

markmnl
sumber
1
Jika Anda baik-baik saja dengan membunuh semuanya pada terminal tertentu, Anda dapat melakukan sesuatu seperti fuser -k /dev/pts/0atau terminal apa pun yang muncul di whooutput. Agak aneh semua SIGHUP yang diabaikan itu. Apakah mereka menjalankan screensesi atau sesuatu?
Bratchley
Saya mendapatkan: Tidak dapat mematikan proses 1031: Tidak ada proses seperti itu. tidak ada yang istimewa hanya SSH dalam menggunakan Putty - Saya pikir router baru saya agresif dalam menjatuhkan koneksi tidak aktif - meskipun saya akan berpikir ujung yang lain akan melakukan sesuatu setelah koneksi TCP berakhir - mungkin tidak tahu (belum)?
markmnl
1
Perbarui perintah yang berfungsi untuk pengguna lain (0 tidak ada wholagi), terima kasih!
markmnl
"Sesi SSH saya tampaknya menurun ... masalah utama adalah sesi saya sebelumnya masih hidup" sedikit kontradiktif. Mereka telah terputus, atau mereka masih terhubung. Mungkin Anda harus menjelaskan bagaimana Anda mencapai kesimpulan ini sedemikian rupa sehingga Anda telah terputus lalu terhubung lagi dan menyadari koneksi lama Anda masih berjalan.
goldilocks

Jawaban:

58

Untuk mengatasi masalah langsung, bahwa file sudoers dikunci, Anda cukup menghapus file kunci. Biasanya akan menjadi `/etc/sudoers.tmp"; periksa halaman manual untuk visudo untuk memverifikasi. Jika Anda menghapus file kunci, Anda dapat menjalankan visudo lagi.

Untuk menghapus semua sesi yang masih menggantung, pertama-tama cari tahu pid dari sesi Anda saat ini. Kemudian, jika pid Anda sendiri adalah 12345, lakukan

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

Anda mungkin ingin melakukannya tanpa final | shterlebih dahulu hanya untuk memeriksa PID yang Anda rencanakan untuk dibunuh.

Jika Anda menggunakan Linux, Anda bisa menggunakannya

pkill -o -u YOURUSERNAME sshd

untuk membunuh sesi SSH tertua Anda. Terus lakukan itu sampai sesi Anda saat ini adalah satu-satunya yang tersisa.

Anda mungkin juga ingin mengatur agar ServerAliveInterval 15Anda .ssh/configmengirim pesan keepalive setiap 15 detik ketika tidak ada data yang dikirim. man ssh_configuntuk informasi lebih lanjut.

Jenny D
sumber
1
On CentOS - Jika Anda sedang SSH untuk me-root akun, jawaban ini tidak berfungsi, coba gunakan yang berikut ini: ps aux | grep ssh | grep -v / usr / sbin | awk '{print $ 2}' | xargs kill
Ali Nadalizadeh
Terima kasih. Ini bekerja. Saya tidak jelas tentang tujuan apa yang digunakan grep -v 12345sebagian dari sintaks? lulus semua yang tidak mengandung 12345?
Tuan Loh.
grep -v 12345berarti "menghapus baris apa pun yang cocok 12345dari pertandingan". Karenanya, pertama-tama Anda harus mengidentifikasi PID dari sesi Anda sendiri, dan gunakan PID itu sebagai ganti 12345.
Jenny D
Setelah membunuh semua sesi seperti itu dan mengundurkan diri, perintah whoatau topmasih menunjukkan jumlah pengguna yang ditandatangani lama, bahkan harus menunjukkan hanya 1. Bagaimana itu bisa dipaksa untuk disegarkan?
Ωmega
2

Jika Anda daftar proses sehingga Anda melihat perintah dan argumen mereka (seperti misalnya ps -fdari procps tidak), Anda harus melihat kemudian proses sshd disebut misalnya:

sshd: user@pts/7

Terminal ( pts/7) adalah bagian kunci di sini - jika Anda membandingkannya dengan terminal Anda saat ini ( tty), Anda dapat melihat mana sesi aktif Anda. Tentu saja ada cara lain untuk melakukan itu (seperti melihat PID dari shell yang sedang berjalan dan menemukan yang ada di pohon proses), tetapi ini kemungkinan yang paling mudah. Anda kemudian dapat menggunakan sesuatu di sepanjang baris ini:

# 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.*//"

Anda kemudian dapat memberi makan PID untuk dibunuh xargstetapi selalu pastikan Anda tidak membunuh sshdproses utama yang menangani koneksi baru .

Pada catatan terkait, maklum bahwa pskeluaran parsing yang cukup umum adalah rawan kesalahan (terutama di berbagai sistem) karena variabilitas format outputnya (di sini dimitigasi secara luas oleh penggunaan -o pid= -o command=).

peterph
sumber
1

Ini akan membunuh sesi yang menggantung selama 2+ hari. Itu bisa dimasukkan sebagai cron.

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

Ini akan membunuh semua kecuali Anda (sesi aktif terakhir). Jalankan ini dari terminal.

for i in `w|tail -n+3|awk '{print $2,$5}'|grep -v 0.00s|cut -d' ' -f1`; do fuser -k /dev/$i; done
Menyeramkan
sumber