Soru SSH bağlantısı koptuğunda konsollar neden bazen sonsuza dek asılır?


Bunu pek çok konsolda (Linux, Mac, ...) ve birçok farklı ağda birçok farklı makineyle gördüm. Tam olarak nedenini tam olarak belirleyemem, neden böyle oluyor: Tek yapmanız gereken SSH ile bir makineye giriş yapmak. Bağlantı bir sebepten dolayı koparsa (basitlik için, ağ kablosunun çekildiğini söyleyin), bazen konsol sonsuza kadar askıda kalıyor - diğer zamanlarda, ana kabuğa iyi geliyor.

Bu olduğunda çok sinir bozucu (örneğin, komut geçmişini kaybedersiniz.) Belki bir çıkışı zorlayabilen gizli bir klavye kısayolu var mı (Ctrl-C veya Ctrl-D çalışmıyor)? Ve tüm bu uygulamalarda bu rastgele "hata" nın nedeni nedir?


75
2018-06-22 18:12


Menşei


Bu konudan bahsetmek uygun görünüyor Mosh (Mobil Kabuk), dolaşım (IP değişimi) ve diğer şeyler de dahil olmak üzere bağlantı hatalarıyla iyi bir şekilde ilgilenir. - Ciprian Tomoiagă


Cevaplar:


Bir çıkışı zorlamak için bir "gizli" klavye kısayolu vardır: ~) Donmuş oturumdan, sırayla şu tuşlara basın: Girmek~. Tilde (yalnızca yeni satırdan sonra) ssh istemcisi tarafından bir çıkış sırası olarak kabul edilir ve süre, istemciye işini daha fazla uzatmadan sona erdirmesini söyler.

İletişim sorunları üzerindeki uzun süreli davranış bir hata değil, SSH oturumu diğer tarafın geri geleceğini umarak asılıyor. Ağ kesilirse, bazen birkaç gün sonra bir SSH oturumu geri alabilirsiniz. Tabii ki, özellikle yukarıdaki diziyle pes etmeyi ve ölmeyi söyleyebilirsiniz. Ayrıca, istemcinizde canlı kalma zaman aşımlarını ayarlama gibi yapabileceğiniz çeşitli şeyler vardır, böylece belirli bir süre boyunca etkin bir bağlantısı yoksa kendi başına kapanır, ancak varsayılan davranış mümkün olduğunca bağlı!

Düzenle: Bu kesme anahtarının başka bir kullanışlı uygulaması, yerel ssh istemcisinin dikkatini çekmek ve bir dakika boyunca yerel kabuğunuza geri dönmek için arka plan - bir şey elde etmek için tarihinizden bir şey elde etmek ve daha sonra uzaktan çalışmaya devam etmesini sağlamaktır. Girmek~  Ctrl+Z ssh istemcisini yerel kabuğunuzun arka plan iş kuyruğuna göndermek için fg geri almak için normal olarak.

Düzenle: Yuvalanmış SSH oturumları ile uğraşırken, zincirdeki SSH oturumlarından yalnızca birini çıkarmak için başka tilde karakterleri ekleyebilir, ancak diğerlerini de tutabilirsiniz. Örneğin, 3 seviyede yuvalanmışsanız (yani, yerel -> Makine1 -> Makine2-> Makine3) Girmek~. yerel oturumunuza geri dönecek, Girmek~~. seni Machine1'de bırakacak ve Girmek~~~. seni Machine2'de bırakacak. Bu, ssh oturumunu geçici olarak arka plana taşımak gibi diğer çıkış sıraları için de çalışır. Yukarıdakiler, daha fazla tilde ekleyerek, herhangi bir yuvalanma seviyesi için çalışır.

Sonunda, kullanabilirsiniz Girmek~? Mevcut kaçış komutlarının yardım menüsünü yazdırmak için

TL; DR - desteklenen çıkış komutları Desteklenen kaçış dizileri:

 ~.   - terminate connection (and any multiplexed sessions)
 ~B   - send a BREAK to the remote system
 ~C   - open a command line
 ~R   - request rekey
 ~V/v - decrease/increase verbosity (LogLevel)
 ~^Z  - suspend ssh
 ~#   - list forwarded connections
 ~&   - background ssh (when waiting for connections to terminate)
 ~?   - this message
 ~~   - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

121
2018-06-22 18:15



Sshd'nin kafasında çekim yapmak için dodecatouple-secret-parolası parolasını bilmek için +1. Bunu benimle aynı şekilde öğrendin mi? ~/.somethingorother isabetine girdikten sonra)? - voretaq7
@ voretaq7: Hayır o kadar zeki değildim, ama birileri bana ipucu verdiğinde ben gittim "Gerçekten mi? Yani bu o zamanlar oluyordu, kabuğum sadece BANG oldu! Yazarken hiçbir sebepten dolayı!". Bahsettiğinizin mistipleri dışında yaygın bir sıralama değil, ama olabilir. - Caleb
Nerede "sır" demek "adam sayfasında" anlamına gelir. - larsks
Birçok insan bunu bilmiyor olsa da, o gerçekten düz bir bakışta bir sırdır. man ssh bunu altında kapsamaktadır ESCAPE CHARACTERS Bölüm. ~. (Bağlantıyı kes) ve ~^Z (arka plan ssh) çok kullanışlı. - Stefan Lasiewski
Tabii ki bu adam sayfasında :) Ben sadece kelime sırrı kullandım çünkü OP yaptı ve ben dilini yanakta kullanıyordum. Bu özellikteki problem, insanların nereye bakacaklarını bilmemeleridir, kontrol karakterlerinin ve bu tür sinyallerin kabuk veya benzeri bir parçası olmasını beklerler. Nereye bakacağınızı ve hatta ne sormanız gerektiğini öğrendiğinizde, elbette var. - Caleb


SSH hayatta kalmak için bir imkan sunuyor. Aşağıdakileri yerel bölgenize ekleyin ~/.ssh/config (var olmuyorsa oluştur):

ServerAliveInterval 15
ServerAliveCount 3

Bu ayar, güvenli tünelden her 15 saniyede bir bekletme sinyali gönderir. Üç ardışık başarısızlıktan sonra SSH müşterisi çıkacak.

Bazı sistemlerde bunun yerine olması gerektiğini unutmayın:

ServerAliveInterval 15
ServerAliveCountMax 3

Bu cevaptan ask.ubuntu'da alınan: https://askubuntu.com/a/29967/30266


11
2018-01-19 08:44





Bu askıda kalması, SSH değil, TCP'nin bir işlevidir. Uygulama, TCP bağlantısının / bağlantısının, TCP'nin bağlantıyı artık yapmadığı bağlantıyı kullanarak uygulamayı bildirmediği sürece kesildiğini bilmenin bir yolu yoktur. Her bir ana bilgisayarın perspektifinden, TCP oturumu hala yerleşik durumdadır ve uzun bir boşta (veri akışı yok) oturumu bir RST dışında veya TCP bekletme paketine yanıt eksikliğinden başka geçerli değildir. evrensel olarak uygulanmamıştır). Bu bana SSH'de bir hata gibi görünmüyor, bu davranışı beklerdim.


8
2018-06-22 19:49





Bağlantı düzgün bir şekilde kurulursa, herhangi bir sihirli tuş vuruşu, tuşa basmadan önce bağlantı zaten askıda olduğundan geçmez. İstemcinin sona erdirileceğini söyleyebilirsiniz, ancak bu, sunucuda tutulan (veya devam etmeyen) geçmişi etkilemez.

Bu aslında soruyu yanıtlamıyor olsa da bağlantıyı asmanın etkilerini azaltmaya yardımcı olabilir: uzaktan çalıştığımda (ve genellikle olmadığım zamanlarda) screen (ile veya olmadan byobu herhangi bir bağlantı kopması varsa, tüm geçmişiyle birlikte oturumum korunur ve yeniden bağlandığımda bıraktığım durumda kullanılabilir.


5
2018-06-22 18:18



Ekranla ilgili öneriniz iyi, ancak ilk bit aslında bu sorun için geçerli değil. Anahtarları uzak tarafa almanıza gerek yok, sadece bunları LOCAL ssh istemcisine götürmelisiniz! OP istemi, geçmişi de dahil olmak üzere kendi yerel kabuğunu geri alıyor. SSH bunu devralır ve CTRL-C gibi normal kırılma dizilerine yanıt vermez, çünkü bunları iletir. Yerel müşteriyi ele geçirip feshetmenin bir yolu var, cevabımı gör. Kabuk yapılandırmasına bağlı olarak tekrar giriş yaparsanız, yerel uçtaki geçmiş genellikle tutulur. - Caleb
@Caleb: özellikle tarih kaybına değinilen soru ve komut geçmişi sunucu tarafında saklanır. Sunucunun tarihe farklı bir şey yapmasını söyleyebilmek için sunucuya bir mesaj almanız gerektiğini söyleyebilmemiz için tarihe farklı bir şey yapması gerekiyor. Tabii ki, bash (ve diğer bazı kabuklar), kullanıcı, kabuk ile birlikte düzgün bir şekilde mevcut olana kadar RAM'de toplayarak değil, tarih satırlarını hemen kaydetme yolları vardır. exit/logout tarih sorununu kullanmadan çözmek screen. - David Spillett