54 puan yazan GN⁺ 2026-03-13 | 5 yorum | WhatsApp'ta paylaş
  • SSH oturumu donduğunda süreci zorla sonlandırmaya gerek kalmadan, SSH’ye gömülü escape sequence menüsü üzerinden çeşitli kontroller yapılabilir
  • Oturum içinde ↵Enter tuşuna bastıktan sonra ~? yazarsanız gizli komut listesi görüntülenir; ~. ile de her durumda bağlantıyı anında kapatabilirsiniz
  • Bu escape sequence’ler SSH istemcisinin kendisine gömülüdür; bu yüzden sunucu yanıt vermese veya bağlantı kopmuş olsa bile çalışır
  • İç içe SSH oturumlarında ~~ kullanarak sequence’i içteki istemciye iletebilirsiniz
  • Ayrıca -C, -v, -D gibi kullanışlı SSH seçenekleri de tanıtılıyor

SSH escape sequence menüsü

  • SSH oturumu içinde ↵Enter tuşuna basıp ardından ~? yazarsanız desteklenen escape sequence listesini görebilirsiniz
  • Başlıca sequence’ler:
    • ~. — bağlantıyı kapatır (multiplex edilmiş oturumlar dahil)
    • ~B — uzak sisteme BREAK sinyali gönderir
    • ~Ckomut satırını açar (port forwarding ayarlanabilir, help yazarak yönergeleri görebilirsiniz)
    • ~Rrekey isteği
    • ~V/v — verbosity’yi (LogLevel) artırır/azaltır
    • ~^Z — SSH’yi askıya alır (suspend)
    • ~# — forward edilen bağlantıların listesini gösterir
    • ~& — SSH’yi arka plana alır (bağlantının kapanmasını beklerken)
    • ~~ — escape karakterinin kendisini gönderir (iki kez girilir)
  • Bu sequence’ler SSH istemcisinin kendisine gömülü olduğundan, SSH sunucusu yanıt vermediğinde veya bağlantı kopmuş olsa bile çalışır
  • En kullanışlısı ~. komutudur; oturum donduğunda her durumda anında çıkış yapmanızı sağlar
  • Escape sequence’ler yalnızca yeni satırdan (newline) hemen sonra algılanır

İç içe SSH oturumlarında kullanım

  • Bir SSH oturumunun içinden yeniden SSH ile bağlandığınız iç içe ortamda, ~~ kullanarak sequence’i içteki istemciye iletebilirsiniz
  • Örnek:
  pinkie@stable:~$ ssh ponyville        # stable  
  pinkie@ponyville:~$ ssh manehatten    # stable › ponyville  
  pinkie@manehatten: ~$                 # stable › ponyville › manehatten  
  pinkie@manehatten:~$ Connection to manehatten closed. # ↵Enter `~~.`  
  pinkie@ponyville:~$                   # stable › ponyville  
  pinkie@ponyville:~$ ssh manehatten stable › ponyville  
  pinkie@manehatten: ~$                 # stable › ponyville › manehatten  
  pinkie@manehatten:~$ Connection to ponyville closed. # ↵Enter `~.`  
  pinkie@stable:~$                      # stable  
  • stable → ponyville → manehatten şeklinde bağlıyken
  • ~~. girildiğinde yalnızca en içteki oturum (manehatten) kapanır ve ponyville’e dönülür
  • ~. girildiğinde ara oturum (ponyville) da kapanır ve stable’a dönülür

Bonus SSH seçenekleri

  • ssh -Cgzip sıkıştırmasını etkinleştirir; belgelerde hızlı ağlarda gereksiz denilse de TUI kullanımı veya büyük miktarda log çıktısında gecikme ve tepki süresini iyileştirmede oldukça etkilidir
  • ssh -vayrıntılı loglamayı etkinleştirir (-vv, -vvv ile daha fazla bilgi gösterilebilir); yavaş bağlantılarda veya Raspberry Pi gibi yavaş cihazlara bağlanırken bağlantının takılıp kalmadığını mı yoksa sadece yavaş mı olduğunu ayırt etmek için kullanışlıdır
  • ssh -D 1234localhost:1234 üzerinde bir SOCKS proxy oluşturur; sunucunun ağı üzerinden erişim sağlayarak sunucu tarafındaki LAN işleri veya basit bir DIY VPN amacıyla kullanılabilir

5 yorum

 
t7vonn 2026-03-13

Vay, gerçekten ilk kez gördüğüm bir özellik; artık terminali kapatmaya gerek kalmayacak sanırım.

 
xguru 2026-03-13

Vay be.. SSH'yi on küsur yıldır kullanıyorum, ilk kez böyle bir özellik görüyorum.
Gerçekten de bir menü açılıyor.

 
bus710 2026-03-13

Cihaz durduruluyor
Ee......

 
GN⁺ 2026-03-13
Hacker News görüşleri
  • manpage'leri güçlü biçimde savunmaya çalışıyordum. Çoğu açık kaynak manpage'in kalitesi yüksek, bazıları ise gerçekten mükemmel
    Ama man aracının kendisinde sorunlar var. Örneğin openssh istemcisindeki ~? gibi escape sözdizimini bulmaya çalıştım ama manpage içinde aranamıyor
    Bunun nedeni man'in ~ karakterini garip bir Unicode tilde işaretine dönüştürmesi; bu yüzden grep ile aranamıyor. - karakteri de aynı şekilde dönüştürülüyor ve aranamıyor
    Bu, komut satırı araçlarının belgelenmesi açısından ölümcül. Bu tür dönüştürme özellikleri varsayılan olarak kapalı olmalı

    • Karakter dönüştürme sorununu bilmiyorum ama ctrl-r ile birebir arama yapılabiliyor (/<ctrl-r>~?)
    • Debian'ın varsayılan pager'ı less ile düzgün çalışıyor
    • man -E ascii seçeneğiyle çözdüm. Ortamım Cygwin 3.6.6, yani dağıtıma özgü bir fark da olabilir
    • Pager olarak neovim kullanırsanız ~? araması düzgün çalışıyor. Yalnız regex escape'ini (\~?) bilmek gerekiyor
    • macOS ve CentOS'ta da \~\? araması düzgün çalışıyor
  • ~. kısayolunu uzun zamandır kullanıyorum ama yardım menüsünü bilmiyordum
    ~ karakterini iki kez girerseniz gerçek bir tilde gönderebilirsiniz ve normal oturumlarda ilk karakter olarak girilmediği sürece escape olarak algılanmaz
    Yani ~ yalnızca satırın ilk karakteri olup yeni satırdan hemen sonra geldiğinde escape olarak çalışır. Arayüz tasarımı epey özenli

    • Genç okurlar için açıklayayım: terminalin echo modunda backspace aslında giriş tamponunu silmez
      Bu yüzden ls ~/^?^?^?^?^?~/a.out gibi bir çıktı görebilirsiniz. SSH ekranı değil, giriş akışını izler
    • Dezavantajı şu: oturum donduğunda ~. ile çıkmak için önce Enter'a basmanız gerekir, bu da sunucuya iletilebilir
  • SSH'yi 15 yıldan uzun süredir kullanıyorum ama böyle escape dizileri olduğunu ilk kez öğrendim
    Bir dahaki sefere oturum donarsa mutlaka ~. deneyeceğim. Terminali kapatmaktan çok daha iyi

    • SSH bağlantınız sık sık kopuyorsa bunun nedeni CGNAT'in kısa TCP timeout süresi olabilir
      VPN veya Tailscale kullanmak bunu çözebilir; ya da bağlantıyı canlı tutmak için tcp_keepalive parametresini ayarlayabilirsiniz
      Örnek ayar:
      net.ipv4.tcp_keepalive_time=240
      net.ipv4.tcp_keepalive_intvl=60
      net.ipv4.tcp_keepalive_probes=120
      
      Böylece CGNAT ortamında da oturum açık kalır
    • Ben 20 yıldır neredeyse her hafta ~. kullanıyorum. SSH'ye -v seçeneği vermek bağlantı sorunlarını debug etmek için de yararlı
    • SSH'yi birden fazla adım üzerinden bağlarken ikinci hop'u ~~. ile kapatabilirsiniz
    • Ben de neredeyse 30 yıldır kullanıyorum, ondan önce de rsh kullanıyordum. Berkeley r-commands bağlantısına bakabilirsiniz
    • ~. yazmadan önce mutlaka Enter'a basıp yeni satırdan başlamalısınız
  • Ben de ~.'ı uzun zamandır kullanıyordum ama diğer escape'leri bilmiyordum. Shell prompt'unda doğrudan çalışmıyor; bu yüzden cat çalıştırıp ardından ~? yazmak gerekiyor

    • Yine de çalışıyor. OpenSSH çıktı değil, yalnızca girdiyi izlediği için <enter>~. ile çıkılabilir
    • Ben de oturumu hep ~. ile kapatıyordum ama ~ karakterinin yalnızca yeni satırda çalıştığını bilmiyordum. ~^Z de kullanışlı görünüyor
      Eski telnet'in ctrl-[ dizisini hatırlattı
    • SSH istemcisi, uzak oturumun modunu bilmese de escape'i algılar. Enter sadece yeni bir escape girişi için hazırlık yapar
  • Bu özellikler aslında rsh'den miras. Yaşlı biri olarak hatırlıyorum

    • Aslında ~ komut tarzı önce cu(1)'de ortaya çıktı. rsh'den de önce, 4.1BSD döneminde
    • Artık scp'yi rcp gibi kullanmak için -O seçeneğini vermek gerekiyor
    • uucp!bangpath dönemini hatırlayan biri olarak buna gülüyorum
  • SSH'nin menüsü tünelleme yaparken kullanışlı. Bugünlerde Tailscale gibi şeylerle yer değiştiriyor ama hâlâ işe yarıyor

    • Yeni sekmede “yeni bağlantı” açarken ben ControlMaster özelliğini kullanıyorum
      Birden fazla SSH oturumunu tek bağlantıda multiplex ederek kimlik doğrulamayı tekrar etmemek mümkün oluyor ve sekme tamamlama da hızlanıyor
      Ama bağlantı takıldığında biraz can sıkıcı olabiliyor
    • Ben tuns.sh'ı sık kullanıyorum. localhost'u dışarıya açabildiği için kullanışlı
  • “Gizli” olmaktan çok, çoğu kişinin manpage'i sonuna kadar okumadığı için bilmediği bir özellik

  • ~ escape'i 1970'lerdeki UNIX cu içinde de vardı. SSH onun bir devamı sayılabilir

  • ControlMaster yapılandırmasının varsayılanları pek kullanışlı değil; bu yüzden aşağıdaki gibi bir yapılandırma bloğu eklemek iyi olabilir

    Host *
      ControlMaster auto
      ControlPath ~/.ssh/sockets/%r@%h:%p
      ControlPersist 10m
    

    Böylece aynı host'a yapılan SSH/scp/rsync bağlantıları mevcut bağlantıyı yeniden kullanır
    Oturum sırasında ~C escape'iyle porta yönlendirme de ekleyebilirsiniz

    • ControlPersist süresini 1 saate kadar çıkarırsanız kısa aralıklı girişlerde bağlantı korunur
    • Bu yorumun LLM tarafından yazılmış gibi göründüğüne dair bir şaka da vardı
  • Ben de SSH oturumu donduğunda yalnızca [Enter] ~. ile toparlayabiliyordum
    Linux uzmanı değilseniz pek bilinmeyen gizli bir özellik gibi duruyor

 
kayws426 2026-03-13

Biliyordum ama pek kullanacağım bir şey değildi. (...)