feragat
SSH bağlantınız kısa ağ kesintilerinden kurtulamıyorsa, izin vermeyen başka bir şey var ssh
ve TCP normal şeylerini yapıyor.
Ayrıntılar için aşağıya bakın. Neyse:
En Hızlı ve En Direk Bağımlılık Yok Çözümü
Bunun gibi bir kabuk komut dosyası oluşturun:
#!/bin/sh -
# Tune these numbers depending on how aggressively
# you want your SSH session to get reconnected.
timeout_options='-o ServerAliveInterval=4 -o ServerAliveCountMax=2'
# 255 is the status OpenSSH uses to signal SSH errors, which
# means we want to connect. All other exit statuses suggest
# an intentional exit.
status=255
# Keep opening the SSH connection and immediately dropping into
# `screen` until an intentional exit happens.
while [ "$status" = 255 ]
do
ssh $timeout_options -t "$@" screen -dR
status=$?
# You can add a `sleep` command here or a counter or whatever
# you might need as far as rate/retry limiting.
done
exit "$status"
Bu sadece bağlanmaya ssh
ve bağlanmaya çalışan aptal-basit bir döngü çalıştıracaktır screen
. Ana bilgisayarı veya normalde ssh
komut satır bağımsız değişkenleri olarak çağrınıza ilettiğiniz her şeyi iletin.
Yeniden bağlanma yalnızca SSH'nin bağlantıda bir hata rapor edip etmediğine dayanır, bu da "kelimenin tam anlamıyla WiFI'nız açık değil" veya başka bir şey gibi SSH olmayan hataları tespit etmek için zekası olmadığı anlamına gelir, ancak bu muhtemelen önemli değildir. sen.
ssh-agent
Yeniden bağlantıların yalnızca sizden ek girdi olmadan çalışmasına izin verecek bir parola olmayan SSH anahtarınız olduğunu varsayıyorum .
^C
Yeniden bağlanma sırasında bir saniyenin sadece insan tarafından algılanamayan fraksiyonu sırasında vurursanız ^C
, istemci terminaline geçmek yerine komut dosyasını öldürmek zorunda kalacağınız küçük bir yarış koşulu olacaktır , bu nedenle bir bağlantı askıda kaldığından şüphelenirseniz püre yok ^C
çok şevkle.
En Basit Ek Yazılım Çözümü
Ubuntu paket deponuzda bulunması gereken autossh programını deneyebilirsiniz .
Kaynaktan derlemeniz veya denetlemeniz gerekiyorsa, bağımlılık olarak herhangi bir ek kitaplık olmadan derleyen, bağlantı canlılığını kontrol etme konusunda yukarıdaki hack'imden daha fazla zekaya sahip gibi görünen tek bir C programı ve aynı zamanda rscreen
otomatik -birine bağlanır screen
.
ayrıntılar
ssh
Normalde nasıl iyileşir
Sadece doğrulamak için, kendimi kontrol etmeden bir şey söylemekten hoşlanmam, cevaplamadan önce küçük bir test yaptım:
Bir Linux cihazı ile WiFi'ye girdim, LAN'ımdaki başka bir cihaza SSH bağlantısı kurdum ssh
, diğer uca çalışan bir bağlantım olduğunu doğruladım (komutları çalıştırabilir, vb.), Ardından istemci WiFi'yi (arayüze neden oldu) yapılandırılacak: daha fazla IP adresi yok), ssh oturumuna bir sürü daha fazla karakter yazdı (elbette yanıt yok) ve ardından WiFi'ime yeniden bağlandım - yeniden bağlantı aslında kötü sinyal ve diğer faktörler nedeniyle en az bir kez başarısız oldu , daha sonra nihayet yeniden bağlandı: ssh
Oturumun iyileşmesi için yaklaşık beş saniye bekledim , hiçbir şey olmadı, bu yüzden bir tuşa daha bastım ve ssh
oturum hemen yeniden canlandı, komut satırında bağlantı kesme sırasında yazdığım tüm tuşlarla.
Bakın, ssh
işletim sistemi bir şeyler ters gittiğini söyleyene kadar TCP ağ soketine yazar / okur ve TCP aslında uzun süreli bağlantı düşüşlerine karşı çok toleranslıdır.
Varsayılan çekirdek ayarlarına sahip kendi cihazlarına bırakıldığında, Linux'taki TCP yığını, bağlantıyı ölü olarak bildirmeden ve bir hata bildirmeden önce birkaç dakika boyunca tamamen sessiz kaldığı için hoş bir şekilde tolere edecek ssh
- nihayet vazgeçtiğinde ballparkta konuşuyoruz ~ 30 dakika veya bir veya bir dakika süren bağlantı hıçkırıklarından daha uzun süre dayanacak kadar uzun.
Kapakların altında, Linux TCP yığını yavaş yavaş daha uzun ve daha uzun gecikmelerle mesajları yeniden dener, yani bağlantınız geri geldiğinde, ssh
oturumunuz tekrar "canlı" görünmeden önce ek gecikmeye bakabilirsiniz .
Neden bu bazen kırılıyor?
Genellikle bir şey, TCP yığınının tolere edeceği miktardan çok daha kısa bir süre kullanılmadığında bağlantının aktif olarak kapanmasına neden olur ve ardından bu bağlantı durumunu ssh
istemcinize bildirmez .
Muhtemelen adaylar şunları içerir:
Her canlı TCP bağlantısını hatırlamak için bellek kullanması gereken güvenlik duvarları veya NAT' yönlendiricileri - DOS saldırılarına karşı bir optimizasyon ve bazı hafifletme olarak, bazen sadece bağlantınızı unuturlar ve daha sonra bunun için gelen paketleri sessizce göz ardı ederler. mevcut bağlantının geçersiz olduğunu hatırlamadığınızda bağlantının ortasında.
Daha iyi davranan güvenlik duvarları / yönlendiricileri, genellikle bir connection reset by peer
hata mesajı olarak görünen bir TCP RST paketi enjekte eder , ancak sıfırlama paketi bir ateşle ve unuttur, bu nedenle istemcinizle bağlantı o anda hala sorun yaşıyor ve paketi de sıfırlayın, istemciniz bağlantının hala hayatta olduğunu düşünecektir.
Sunucunun kendisi , beklenmedik paketleri sessizce bırakmak için bir güvenlik duvarı ilkesine sahip olabilir; bu, sunucu bağlantıyı her kapattığında istemcinin bağlantı sürdürme girişimlerini keser, ancak istemci yapmaz: istemciniz bağlantıyı sürdürmeye çalışır, ancak sunucu sadece bu paketlerin sunucunun güvenlik duvarı durumuna ait olduğu canlı bir bağlantı olmadığı için yoksayılır.
Linux çalıştırdığınız için, sunucunuzun iptables
/ ip6tables
(veya nft
yeni şeyleri kullanıyorsanız) tam olarak izin verdiğiniz veya bıraktığınız şeyleri dikkatlice kontrol edin . Bu izin çok yaygındır yeni / kurulan / ilgili TCP SSH bağlantı noktasında paketleri, ama değil "geçersiz" olanlar - Eğer izin verilmez sessizce her şeyi bırakarak eğer, bu ortak kurulum kısa bağlantı sorunları sonra donuyor bu tür neden olabilir .
SSH sunucunuzun kendisi, TCP veya SSH istemci tutma paketleri için OpenSSH seçeneklerinden birini kullanarak bir süre kullanılmadığında bağlantıyı kapatacak şekilde yapılandırılmış olabilir. Tek başına bu belirsiz asılmalara neden olmaz, ancak sizi yukarıda açıklanan durumlardan birine sokabilir.
ssh
Oturumunuzun kapandığı duruma geldikten sonra kendi başınıza "çözülmesini" sağlamak için yeterli zaman vermemeniz mümkündür .
<Enter>
ve tip~.
(-yukarı ok veya örneğin bağlantıyı kesmek için tarafını anlatmaya ve sadece tekrar bağlanma son ssh komutu tekrarlayabilirsiniz!!
).