SSH bağlantısı koptuğunda neden konsollar bazen sonsuza kadar askıda kalıyor?


89

Bunu birçok konsolla (Linux, Mac, ...) ve birçok farklı ağlarda birçok farklı makineyle gördüm. Asla nedenini tam olarak belirleyemiyorum, bu neden olur: Tek yapmanız gereken SSH aracılığıyla bir makineye giriş yapmak. Bağlantı bir nedenden ötürü koparsa (basitlik için, ağ kablosunun çekildiğini söyleyelim), o zaman bazen konsol sonsuza dek askıda kalıyor - diğer zamanlarda ana kabuğa ince bir şekilde çıkıyor.

Bu olduğunda çok sinir bozucu (örneğin komut geçmişini kaybedersiniz.) Belki bir çıkışı zorlayabilecek gizli bir klavye kısayolu var mı (Ctrl-C veya Ctrl-D çalışmıyor)? Ve bu rastgele “böceğin” neden tüm uygulamalardaki nedeni nedir?


Bu konu , dolaşım (IP değişikliği) ve diğer şeyler de dahil olmak üzere bağlantı hatalarıyla iyi bir şekilde ilgilenen Mosh'tan (Mobile Shell) bahsetmek için uygun görünüyor .
Ciprian Tomoiagă

Yanıtlar:


137

Bir çıkışı zorlamak için "gizli" bir klavye kısayolu var: ~) Dondurulmuş oturumdan, şu tuşlara sırayla basın: Enter~.Tilde (yalnızca yeni bir satırdan sonra) ssh istemcisi tarafından bir kaçış dizisi olarak tanınır ve süre müşteri daha fazla uzatmadan işini sonlandırmak için.

İletişim konularındaki uzun süren davranış bir hata değil, SSH oturumu diğer tarafın geri döneceğini umarak takılıyor. Şebeke koparsa, bazen günler sonra bile bir SSH seansı alabilirsiniz. Elbette pes etmesini ve yukarıdaki sekansla ölmesini özellikle söyleyebilirsin. Müşterinizde canlı tutma zaman aşımına uğrama zaman aşımını ayarlama gibi yapabileceğiniz çeşitli şeyler de vardır, böylece belirli bir süre için etkin bir bağlantıya sahip değilse, kendi kendine kapanması gerekir, ancak varsayılan davranış olarak kalmaktır. mümkün olduğunca bağlı!

Düzenleme: Bu kesme anahtarının bir başka kullanışlı uygulaması, yerel ssh istemcisinin dikkatini çekmek ve onu bir dakika süreyle yerel kabuğunuza geri götürmek için arka plan yapmaktır - geçmişinizden bir şey almak için söyleyin - daha sonra uzaktan çalışmaya devam etmesini bekleyin. Enter~ Ctrl+ Zssh istemcisini yerel kabuğunuzun arkaplan iş kuyruğuna göndermek, sonra fggeri almak normaldir.

Düzenleme: Yuvalanmış SSH oturumlarıyla uğraşırken, zincirdeki SSH oturumlarından yalnızca birini kırmak için birden fazla tilde karakteri ekleyebilirsiniz ancak diğerlerini koruyabilirsiniz. Örneğin, 3 seviyede yuvalanmışsanız, (örneğin, yerel-> Makine1-> Makine2-> Makine3'ten ssh alırsınız), Enter~.sizi yerel oturumunuza geri götürür, sizi Makine1'de bırakır Enter~~.ve Enter~~~.sizi Makine2'de bırakır. . Bu, ssh oturumunu geçici olarak arka plana taşıma gibi başka kaçış dizileri için de geçerlidir. Yukarıdakiler, yalnızca daha fazla tilde ekleyerek, herhangi bir yuvalama düzeyi için işe yarar.

Son olarak, Enter~?mevcut kaçış komutlarının bir yardım menüsünü yazdırmak için kullanabilirsiniz .

TL; DR - desteklenen kaçış 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.)

11
Sshd'yi kafaya çekmek için on iki gizli gizli deneme şifresini bilmek için +1. Bunu benim yaptığım gibi öğrendin ~/.somethingorothermi?
voretaq7

2
@ voretaq7: Hayır, o kadar da akıllı değildim, ama biri bana ipucu verdiğinde "Gerçekten mi? Demek bütün bunlar oluyordu ki, kabuğum BANG! . Bahsettiğin yanlış yazıpları dışında sıradan bir dizi değil, ama olabilir.
Caleb

14
Bu nedenle “sır”, “man sayfasında” anlamına gelir.
larsks

4
Birçok insan bunu bilmese de, bu gerçekten düz görünümde bir sır. man sshbunu ESCAPE CHARACTERSbölümün altında kapsar . ~.(Bağlantıyı kes) ve ~^Z(arka plan ssh) çok kullanışlıdır.
Stefan Lasiewski

9
Tabii ki man sayfasında. :) OP kelimesini kullandığım için sadece gizli kelimesini kullandım ve dili yanağında kullandım. Bu özelliğin sorunu, insanların nerede arayacaklarını bilmemeleri, kontrol karakterlerinin ve bu tür sinyallerin kabuğun bir parçası olmasını beklemeleridir. Nereye bakacağınızı veya ne soracağınızı bile öğrendikten sonra, elbette orada.
Caleb

12

SSH, canlı tutma imkanı sunar. Aşağıdakileri yerelinize ekleyin ~/.ssh/config(yoksa mevcut oluşturun):

ServerAliveInterval 15
ServerAliveCount 3

Bu ayar, güvenli tünelden her 15 saniyede bir canlı tutma sinyali oluşturacaktır. Ardışık üç hatadan sonra, SSH istemcisi kapanacak.

Bazı sistemlerde (macOS 10.14 dahil) bunun yerine yapılması gerektiğini unutmayın:

ServerAliveInterval 15
ServerAliveCountMax 3

Ask.ubuntu bu cevaptan alınmıştır: https://askubuntu.com/a/29967/30266


9

Askıda kalması, SSH'nin değil TCP'nin bir işlevidir. Uygulamanın, bağlantının artık varolmadığı bağlantıyı kullanan TCP tarafından bilgilendirilmediği sürece, uygulamanın TCP oturumunun / bağlantının kesildiğini bilmesinin bir yolu yoktur. Her ana bilgisayarın bakış açısından bakıldığında, TCP oturumu hala Kurulmuş durumdadır ve uzun süre boşta (veri akışı olmayan) bir oturumun RST veya bir TCP sürdürme paketine yanıt vermeme durumu dışında geçerli olmadığını söyleyen hiçbir şey yoktur. evrensel olarak uygulanmadı). Bu bana SSH'de bir böcek gibi görünmüyor, bu davranışı beklerdim.


5

Bağlantı düzgün şekilde asıldıysa, tuşlara basmadan önce bağlantı zaten asılı olduğu için herhangi bir sihirli tuşa basılmaz. Müşteriye son vermesini söyleyebilirsiniz ancak bu, sunucu ucunda tutulan (veya kalmayan) geçmişi etkilemez.

Bu aslında soruyu cevaplamamakla birlikte, bağlantının askıda kalmasının etkilerini azaltmaya yardımcı olabilir: Uzaktan çalıştığımda (ve genellikle de olmadığım zamanlarda bile) screen( byobuuygunluğuna bağlı olarak sarıcıyla veya sargısız) Böylece, herhangi bir tür bağlantı varsa, oturumumu, tüm geçmişi olan, yeniden bağlandığımda bıraktığım durumda muhafaza edilir ve kullanılabilir durumda kalır.


6
Ekranla ilgili öneriniz iyi, ancak ilk bit aslında konu için geçerli değil. Anahtarları uzak tarafa geçmenize gerek yok, yalnızca onları YEREL ssh istemcisine yönlendirmeniz yeterli! OP, tarih dahil yerel kabuğunu geri istiyor. SSH devraldı ve CTRL-C gibi normal kırılma dizilerine cevap vermiyor çünkü bunları geçiyor. Yerel müşteriyi geçmenin ve feshetmenin bir yolu var, cevabımı görün. Yerel uçtaki tarih genellikle, yine de kabuk yapılandırmasına bağlı olarak giriş yaparsanız saklanır.
Caleb

2
@Caleb: Özellikle tarihi kaybettiğinden söz edilen soru ve komut geçmişi sunucu tarafında saklanır. Sunucuya, geçmişle farklı bir şey yapmasını söylemek için, sunucuya, geçmişle farklı bir şey yapmasını söyleyen bir mesaj almanız gerekir. Elbette, bash (ve diğer bazı kabukların), kullanıcının tarih meselesini kullanmadan exit/ ile logoutçözecek olan kabuk ile doğru şekilde var olana kadar RAM'de toplamak yerine, tarih satırlarını hemen kaydetmesini sağlamanın yolları vardır screen.
David Spillett
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.