SSH oturumları kapatma / yeniden başlatma işleminde askıda kalıyor


14

Debian ve sshd üzerinde çalışan bir sunucum var ve sunucuyu yeniden başlatmam gerekiyorsa, SSH oturumum TCP zaman aşımına kadar istemci tarafında kilitleniyor. Ben sshdbunun sonlandırıldığında zaman açıkça açık SSH oturumları ana bilgisayara yakın değildir çünkü varsayalım . sshdÖnce herkesin bağlantısını kesip sonra normal olarak sonlandırmak için ne yapmalıyım ? Şimdiye kadar man sshd_config, kapanma davranışı ile ilgili bir parametre görmüyorum .


1
Her şey başarısız olduğunda, bir SSH istemcisini istediğiniz zaman [Enter] [~] [.] Tuşlarına basarak öldürebilirsiniz. Sorununuzun nasıl çözüleceğine dair açıklama da geliyor.
n.st

Yanıtlar:


32

Sisteminizi kapattığınızda veya yeniden başlattığınızda, systemdtüm hizmetleri olabildiğince hızlı durdurmaya çalışır. Bu, ağı düşürmeyi ve hala hayatta olan tüm süreçleri - genellikle bu sırayla - sonlandırmayı içerir. Bu nedenle systemd, SSH oturumlarınızı işleyen çatallı SSH işlemlerini öldürdüğünde, ağ bağlantısı zaten devre dışıdır ve istemci bağlantısını zarif bir şekilde kapatmanın bir yolu yoktur.

İlk düşünceniz, kapatma sırasında ilk adım olarak tüm SSH işlemlerini öldürmek olabilir ve orada bunu yapan birkaç sistemd hizmet dosyası vardır.

Ama elbette daha temiz bir çözüm var (nasıl yapılması gerekiyordu) systemd-logind.
systemd-logindetkin kullanıcı oturumlarını (yerel ve SSH olanlar) izler ve bunlar içinde oluşan tüm işlemleri "dilimler" olarak adlandırır. Bu şekilde, sistem kapatıldığında, systemd kullanıcı dilimleri içindeki her şeyi SIGTERM (belirli bir oturumu gerçekleştiren çatallı SSH işlemini içerir) ve sonra hizmetleri ve ağı kapatmaya devam edebilir.

systemd-logindyeni kullanıcı oturumlarından haberdar olmak için bir PAM modülü gerektirir ve durumunu kontrol etmek dbusiçin kullanmanız gerekir loginctl, bu nedenle her ikisini de yükleyin:

apt-get install libpam-systemd dbus

/etc/ssh/sshd_configAslında modülü kullanacağınızdan emin olun UsePAM yes.


Tamam, hedefe ulaşıldı ve açıklama için teşekkürler. (Kapatma için bir çeşit bağımlılık kontrolü istememize rağmen, işlerini bitirirken her şey ilk önce SIGTERM'd olur, bu katmanlı bir çözüm olarak yapabilir.)
Vesper

Nedense sadece StackOverflow ziyaret ederken cevap hakkında haberdar değildi. Tuhaf.
Vesper

1
Yani, kısaca, sadece kapanışta birkaç saniye tıraş etmek için, bağlantılarımızın düzgün bir şekilde sonlandırılması için tam bir bok yükü yüklemeliyiz? Ciddi anlamda ? Bu durum kötüye gidiyor. Mahkum olduk.
leucos

3
Libpam-systemd ve dbus yüklendikten sonra ilk yeniden başlatmanın SSH oturumunuzu hala bırakacağını unutmayın. Yerine, Bunu önlemek için reboot, bir do shutdown -rSSH oturumu kapatmak için size zaman bırakır 1 dakika gecikme için hangi varsayılan.
mivk

Bu sorunu 2020'de hala yaşıyoruz (Debian buster'ın yeni kurulumu). Burada gösterilen çözüm benim için işe yaramadı; ancak Rfraile'nin cevabı yaptı.
Binarus

9

Bu, sunucu tarafında değil, istemci tarafında ayarlamanız gereken bir şeydir. İçereceğiniz ~/.ssh/configiçeriği düzenleyin

ServerAliveInterval 15
ServerAliveCountMax 5

Bu, 15 saniye işlem yapılmadığında istemcinizin sunucuya bir mesaj göndereceği anlamına gelir. Herhangi bir yanıt almazsa, 5 defaya kadar tekrar dener ve hala bir cevap alamazsa, oturumu kapatır.


2
Bu, ssh istemci raporları sunucusunun ölümünden önce 75 saniye gecikmeye neden olur. Sağ?
Vesper

1
Evet, daha kısa zaman aşımı elde etmek için parametreleri ayarlayabilirsiniz.
Tero Kilkanen

Bu benim için problemi çözdü. Böyle sinir bozucu bir sorun.
Justin Andrusk

6

Bu davranış, bu Debian Bug bildirilir , otomatik olarak varsayılan olarak kopyalanmadığı için yalnızca paketle birlikte gönderilen kapatma komut dosyalarını doğru şekilde ayarlamanız gerekir:

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

İyi iş. Bu sorun benim için bir acıydı ... birkaç yıldır. Bununla birlikte, çok fazla zaman ve araştırma yapmak için gerekli ve yaşamı tehdit edici değildi. Şimdi 2020 ve açıkçası, Linux distribütörleri hala çözemiyor (Debian buster'ın yeni kurulumu). Kazara, başka bir şey araştırırken, bu cevaba rastladım, çabucak denedim, işe yarayacağını beklemeden (gördüğüm diğer tüm çözümler işe yaramadı), ama hey - Başarı! Kaldırıldı ... Ve bu arada, kabul edilen cevap benim için işe yaramadı (muhtemelen üç yıl sonra olduğu için).
Binarus

1

Jenny D'nin cevabında sadece bir ssh komutu için bahsettiği seçenekleri belirtebilirsiniz.

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

bunu sık sık yaparsanız, komut dosyasını yazabilirsiniz.


0

Lshd ile benim için çalışıyor. Yani çözüm

apt install lsh-server
apt remove openssh-server

0

ne yazık ki serverfault yıllardan beri çok az puan nedeniyle konu cevap vermeme izin vermedi. Ama kilit açma ^^ almak için diğer bloglarda spam gerek yok ... yani özel cevap olarak:

Rfraile'nin belirttiği gibi

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

İşler. Örneği / sunucuyu yeniden başlatmadan kullanmak için ek görevler yapmanız gerekir:

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

böylece hizmet kaydedilir ve başlatılır ve systemd'nin yeniden başlatma / kapatma amacıyla durdurması gerekir.


Yani başka bir cevabı mı tekrarlıyorsun?
RalfFriedl

Hayır? 2 satırı sadece üst yanıt için referans olarak kullandım çünkü henüz yazılı olarak cevap veremiyorum. Yeniden başlatmadan kullanmak için gerekli adımları ekledim. Bu başka bir soru iş parçacığında da verilebilir ama ben teslim değil.
Reiner030
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.