Sesi SSH menunggu shutdown / reboot

13

Saya memiliki server yang menjalankan Debian dan sshd di atasnya, dan kalau-kalau saya perlu me-reboot server sesi SSH saya hang di sisi klien sampai batas waktu TCP. Saya berasumsi ini karena ketika sshdsedang dihentikan itu tidak secara eksplisit menutup sesi SSH terbuka untuk tuan rumah. Apa yang harus saya lakukan untuk sshdmemutus sambungan semua orang, lalu menghentikannya seperti biasa? Sejauh ini saya tidak melihat parameter dalam man sshd_configyang terkait dengan perilaku shutsown.

Doa malam
sumber
Ketika semuanya gagal, Anda dapat membunuh klien SSH kapan saja dengan menekan [Enter] [~] [.]. Penjelasan tentang bagaimana sebenarnya memecahkan masalah Anda yang akan datang juga.
n.st

Jawaban:

32

Ketika Anda mematikan atau menyalakan ulang sistem Anda, systemdcobalah untuk menghentikan semua layanan secepat mungkin. Itu melibatkan menjatuhkan jaringan dan menghentikan semua proses yang masih hidup - biasanya dalam urutan itu. Jadi ketika systemd membunuh proses SSH bercabang yang menangani sesi SSH Anda, koneksi jaringan sudah dinonaktifkan dan mereka tidak memiliki cara untuk menutup koneksi klien dengan anggun.

Pikiran pertama Anda mungkin hanya membunuh semua proses SSH sebagai langkah pertama selama shutdown, dan ada beberapa file layanan systemd di luar sana yang melakukan hal itu.

Tapi tentu saja ada solusi lebih rapi (bagaimana itu "seharusnya" dilakukan): systemd-logind.
systemd-logindmelacak sesi pengguna aktif (lokal dan SSH) dan menetapkan semua proses yang muncul di dalamnya untuk apa yang disebut "irisan". Dengan begitu, ketika sistem dimatikan, systemd hanya dapat SIGTERM semua yang ada di dalam irisan pengguna (yang mencakup proses SSH bercabang yang menyerahkan sesi tertentu) dan kemudian terus mematikan layanan dan jaringan.

systemd-logindmembutuhkan modul PAM untuk mendapatkan pemberitahuan tentang sesi pengguna baru dan Anda harus dbusmenggunakan loginctluntuk memeriksa statusnya, jadi instal keduanya:

apt-get install libpam-systemd dbus

Pastikan Anda /etc/ssh/sshd_configbenar-benar akan menggunakan modul UsePAM yes.

n.st
sumber
Oke, tujuan tercapai, dan terima kasih atas penjelasannya. (Meskipun saya ingin beberapa cara kontrol ketergantungan untuk shutdown, sehingga semuanya adalah SIGTERM yang pertama sementara dapat menyelesaikan pekerjaan mereka, ini dapat dilakukan sebagai solusi berlapis.)
Vesper
Untuk beberapa alasan saya tidak diberitahu tentang jawabannya saat mengunjungi hanya StackOverflow. Aneh.
Vesper
1
Jadi, singkatnya, hanya untuk mencukur beberapa detik pada saat shutdown, kita harus menginstal seluruh muatan omong kosong agar koneksi kita terputus dengan benar? Serius? Ini semakin serba salah. Kita celaka.
leucos
3
Perhatikan bahwa pertama kali reboot setelah menginstal libpam-systemd dan dbus akan tetap membuat sesi SSH Anda menggantung. Untuk menghindari itu, alih-alih reboot, lakukan shutdown -ryang default ke penundaan 1 menit, sehingga Anda punya waktu untuk menutup sesi SSH.
mivk
9

Ini adalah sesuatu yang Anda perlu atur di sisi klien, bukan sisi server. Mengedit Anda ~/.ssh/configmengandung

ServerAliveInterval 15
ServerAliveCountMax 5

Ini berarti bahwa setelah 15 detik tidak aktif, klien Anda akan mengirim pesan ke server. Jika tidak mendapat respons, ia akan mencoba lagi hingga 5 kali, dan ketika masih tidak mendapatkan jawaban, itu akan menutup sesi.

Jenny D
sumber
2
Ini akan menghasilkan penundaan 75-an sebelum klien ssh melaporkan server mati. Baik?
Vesper
1
Ya, dan Anda dapat menyesuaikan parameter untuk mendapatkan batas waktu lebih pendek.
Tero Kilkanen
Ini memecahkan masalah bagi saya. Masalah yang menjengkelkan.
Justin Andrusk
5

Perilaku ini dilaporkan pada Bug Debian ini , Anda hanya perlu mengatur dengan benar skrip shutdown yang dikirimkan bersama paket karena, secara otomatis, skrip tersebut tidak disalin secara default:

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service
Rfraile
sumber
1

Anda dapat menentukan opsi yang dibicarakan Jenny D dalam jawabannya hanya untuk satu perintah ssh, seperti

ssh -t -o ServerAliveInterval=1 -o ServerAliveCountMax=1 user@host sudo poweroff

jika Anda sering melakukannya, Anda dapat menulisnya.

Diego Medaglia
sumber
0

Bekerja untukku dengan lshd. Jadi solusinya

apt install lsh-server
apt remove openssh-server
Tuhan
sumber
0

sayangnya serverfault tidak membiarkan saya menjawab karena terlalu sedikit poin sejak bertahun-tahun. Tapi saya tidak perlu mengirim spam ke blog lain untuk mendapatkan penguncian ^^ ... jadi sebagai jawaban khusus:

Seperti yang disebutkan Rfraile

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service

bekerja. Untuk menggunakannya tanpa me-reboot instance / server Anda harus melakukan tugas tambahan:

systemctl daemon-reload
systemctl start ssh-session-cleanup.service

jadi layanan terdaftar dan dimulai dan systemd perlu menghentikannya untuk keperluan reboot / shutdown.

Reiner030
sumber
Jadi, apakah Anda hanya mengulangi jawaban lain?
RalfFriedl
Tidak? Saya menggunakan 2 baris hanya sebagai referensi untuk balasan atas karena saya belum dapat menjawab sebagaimana ditulis. Saya menambahkan langkah-langkah yang diperlukan untuk menggunakannya tanpa reboot. Ini dapat diberikan juga di utas pertanyaan lain tetapi saya belum memeriksanya.
Reiner030