54 पॉइंट द्वारा GN⁺ 2026-03-13 | 5 टिप्पणियां | WhatsApp पर शेयर करें
  • जब SSH session अटक जाए, तो process को force quit किए बिना SSH में built-in escape sequence menu के ज़रिए कई तरह के control किए जा सकते हैं
  • session के भीतर ↵Enter दबाने के बाद ~? टाइप करें, तो hidden commands की सूची दिखाई देती है, और ~. से किसी भी स्थिति में तुरंत connection बंद किया जा सकता है
  • ये escape sequences खुद SSH client में built-in होते हैं, इसलिए server response न होने या connection टूट जाने पर भी काम करते हैं
  • nested SSH sessions में ~~ का इस्तेमाल करके sequence को inner client तक भेजा जा सकता है
  • इसके अलावा -C, -v, -D जैसे काम के SSH options भी साथ में बताए गए हैं

SSH escape sequence menu

  • SSH session के भीतर ↵Enter दबाने के बाद ~? टाइप करने पर supported escape sequences की सूची देखी जा सकती है
  • मुख्य sequences की सूची:
    • ~. — connection बंद करना (multiplexed sessions सहित)
    • ~B — remote system को BREAK signal भेजना
    • ~Ccommand line खोलना (port forwarding सेट किया जा सकता है, help टाइप करके निर्देश देखे जा सकते हैं)
    • ~Rrekey request
    • ~V/v — verbosity(LogLevel) बढ़ाना/घटाना
    • ~^Z — SSH को अस्थायी रूप से रोकना (suspend)
    • ~# — forwarded connections की सूची दिखाना
    • ~& — SSH को background में भेजना (जब connection बंद होने का इंतज़ार हो रहा हो)
    • ~~ — escape character को ही भेजना (दो बार टाइप करके)
  • ये sequences SSH client में ही built-in होते हैं, इसलिए SSH server response न दे रहा हो या connection टूट गया हो, तब भी ये काम करते हैं
  • इनमें सबसे उपयोगी ~. है, जिससे session अटक जाने पर किसी भी स्थिति में तुरंत बाहर निकला जा सकता है
  • escape sequences को सिर्फ नई पंक्ति (newline) के तुरंत बाद ही पहचाना जाता है

nested SSH sessions में उपयोग

  • SSH session के अंदर दोबारा SSH से login किए गए nested environment में ~~ का उपयोग करके sequence को inner client तक भेजा जा सकता है
  • उदाहरण:
  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 के रूप में login होने की स्थिति में
  • ~~. डालने पर सिर्फ सबसे अंदर वाला session (manehatten) बंद होता है और ponyville पर वापसी होती है
  • ~. डालने पर बीच वाला session (ponyville) तक बंद हो जाता है और stable पर वापसी होती है

bonus SSH options

  • ssh -Cgzip compression सक्षम करता है; documentation में इसे तेज network पर अनावश्यक बताया गया है, लेकिन TUI उपयोग या बड़े पैमाने पर log output के समय latency और responsiveness बेहतर करने में काफ़ी असरदार हो सकता है
  • ssh -vdetailed logging सक्षम करता है (-vv, -vvv से और अधिक जानकारी दिखाई जा सकती है); slow connection या Raspberry Pi जैसे धीमे डिवाइस से जुड़ते समय connection सच में अटका है या सिर्फ धीमा है, यह समझने में उपयोगी है
  • ssh -D 1234localhost:1234 पर SOCKS proxy बनाता है, जिससे server के network के ज़रिए access किया जा सकता है और server-side LAN कामों या सरल DIY VPN की तरह इस्तेमाल किया जा सकता है

5 टिप्पणियां

 
t7vonn 2026-03-13

वाह, यह सच में पहली बार देखी गई फीचर है; अब शायद टर्मिनल बंद नहीं करना पड़ेगा

 
xguru 2026-03-13

वाह.. SSH को इतने सालों से इस्तेमाल कर रहा हूँ, फिर भी यह फीचर पहली बार देख रहा हूँ.
सच में मेन्यू दिखाई देता है।

 
bus710 2026-03-13

डिवाइस को बंद कर रहे हैं
उह......

 
GN⁺ 2026-03-13
Hacker News की राय
  • मैंने हमेशा manpage का ज़ोरदार समर्थन किया है। ज़्यादातर open source manpage की गुणवत्ता बहुत अच्छी होती है, और कुछ तो वाकई बेहतरीन हैं
    लेकिन man टूल में खुद दिक्कत है। उदाहरण के लिए, मैं openssh client के ~? जैसे escape syntax को ढूँढ़ना चाहता था, लेकिन manpage में वह search नहीं हो रहा था
    वजह यह है कि man ~ कैरेक्टर को किसी अजीब Unicode tilde में बदल देता है, जिससे grep करना नामुमकिन हो जाता है। - कैरेक्टर के साथ भी यही होता है, इसलिए उसे भी search नहीं किया जा सकता
    command-line tools के documentation के लिए यह घातक है। इस तरह का transformation default रूप से बंद होना चाहिए

    • मुझे character transformation वाली समस्या का पता नहीं था, लेकिन ctrl-r दबाकर literal search किया जा सकता है (/<ctrl-r>~?)
    • Debian के default pager less में यह सही काम करता है
    • मैंने man -E ascii option से इसे ठीक किया। मेरा environment Cygwin 3.6.6 है, इसलिए यह distro का फर्क भी हो सकता है
    • अगर neovim को pager बनाएं तो ~? search ठीक से काम करती है। बस regex escape(\~?) पता होना चाहिए
    • macOS और CentOS में भी \~\? search सही चलती है
  • मैं ~. shortcut तो लंबे समय से इस्तेमाल कर रहा था, लेकिन help menu के बारे में नहीं जानता था
    ~ को दो बार टाइप करने पर असली tilde कैरेक्टर भेजा जा सकता है, और सामान्य session में यह escape तभी माना जाता है जब यह पहली character के रूप में आए
    यानी ~ सिर्फ तब escape की तरह काम करता है जब वह लाइन का पहला कैरेक्टर हो और नई लाइन के तुरंत बाद आए। UI design काफ़ी सोच-समझकर की गई है

    • युवा पाठकों के लिए: terminal के echo mode में backspace वास्तव में input buffer को मिटाता नहीं है
      इसलिए ls ~/^?^?^?^?^?~/a.out जैसा output दिख सकता है। SSH screen नहीं बल्कि input stream को देखता है
    • कमी यह है कि session फ्रीज़ होने पर ~. से बंद करने के लिए पहले Enter दबाना पड़ता है, और यह server तक पहुँच भी सकता है
  • मैं 15 साल से ज़्यादा समय से SSH इस्तेमाल कर रहा हूँ, लेकिन ये escape sequences पहली बार देख रहा हूँ
    अगली बार session फ्रीज़ हुआ तो ~. ज़रूर आज़माऊँगा। terminal बंद करने से यह कहीं बेहतर है

    • अगर SSH connection बार-बार टूटता है, तो वजह CGNAT का छोटा TCP timeout हो सकती है
      VPN या Tailscale इस्तेमाल करने से यह ठीक हो सकता है, या फिर tcp_keepalive parameter को adjust करके connection जिंदा रखा जा सकता है
      उदाहरण config:
      net.ipv4.tcp_keepalive_time=240
      net.ipv4.tcp_keepalive_intvl=60
      net.ipv4.tcp_keepalive_probes=120
      
      इससे CGNAT environment में भी session बना रहता है
    • मैं 20 साल से हर हफ्ते ~. इस्तेमाल कर रहा हूँ। SSH में -v option देने से connection issues debug करने में भी मदद मिलती है
    • SSH को कई चरणों में connect करते समय ~~. से दूसरे hop को बंद किया जा सकता है
    • मैं भी लगभग 30 साल से इसका इस्तेमाल कर रहा हूँ, और उससे पहले rsh इस्तेमाल करता था। Berkeley r-commands देखें
    • ~. टाइप करने से पहले हमेशा Enter दबाकर नई लाइन से शुरू करना चाहिए
  • मैं भी ~. लंबे समय से इस्तेमाल कर रहा था, लेकिन बाकी escape नहीं जानता था। shell prompt पर यह तुरंत काम नहीं करता, इसलिए cat चलाने के बाद ~? टाइप करना पड़ता है

    • फिर भी यह काम करता है। OpenSSH output नहीं बल्कि सिर्फ input को monitor करता है, इसलिए <enter>~. से session बंद किया जा सकता है
    • मैं भी हमेशा ~. से session disconnect करता था, लेकिन ~ सिर्फ नई लाइन में काम करता है यह नहीं जानता था। ~^Z भी उपयोगी लग रहा है
      इससे पुराने telnet के ctrl-[ sequence की याद आ गई
    • SSH client remote session के mode को जाने बिना भी escape पहचान लेता है। Enter सिर्फ नया escape input शुरू करने की तैयारी करता है
  • ये फीचर असल में rsh से आए हैं। उम्रदराज़ लोगों को यह याद होगा

    • दरअसल ~ command style पहले cu(1) में आया था। यह rsh से भी पहले, 4.1BSD के समय की बात है
    • आजकल scp को rcp की तरह इस्तेमाल करना हो तो -O option देना पड़ता है
    • uucp!bangpath के दौर को याद करने वालों के लिए यह काफ़ी मज़ेदार है
  • SSH का menu tunneling करते समय काम आता है। आजकल इसे Tailscale जैसी चीज़ें replace कर रही हैं, लेकिन यह अब भी उपयोगी है

    • मैं नए tab में “नई connection” खोलते समय ControlMaster feature इस्तेमाल करता हूँ
      इससे कई SSH sessions को एक ही connection पर multiplex किया जा सकता है, बार-बार authentication नहीं करना पड़ता, और tab completion भी तेज़ हो जाती है
      लेकिन connection फ्रीज़ होने पर यह थोड़ा झंझट भरा हो जाता है
    • मैं अक्सर tuns.sh इस्तेमाल करता हूँ। इससे localhost को बाहर expose करना आसान हो जाता है
  • इसे “secret” कहना ठीक नहीं; ज़्यादातर लोग manpage को अंत तक नहीं पढ़ते, इसलिए यह फीचर कम जाना जाता है

  • ~ escape 1970 के दशक के UNIX cu में भी इस्तेमाल होता था। SSH को उसका उत्तराधिकारी कहा जा सकता है

  • ControlMaster settings के default मान सुविधाजनक नहीं हैं, इसलिए नीचे जैसा config block जोड़ना अच्छा रहता है

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

    इससे उसी host के लिए SSH/scp/rsync मौजूदा connection को reuse करते हैं
    ~C escape से session के बीच में port forwarding भी जोड़ा जा सकता है

    • ControlPersist को 1 घंटे तक बढ़ा दें तो छोटे-छोटे login अंतराल में भी connection बना रहता है
    • इस comment पर मज़ाक में कहा गया कि यह LLM ने लिखा लगता है
  • जब SSH session फ्रीज़ हो जाता था, तब मैं भी सिर्फ [Enter] ~. से ही recover कर पाता था
    यह शायद Linux experts के अलावा ज़्यादा लोगों को पता न होने वाला छिपा हुआ फीचर है

 
kayws426 2026-03-13

मुझे इसके बारे में पता था, लेकिन इसका इस्तेमाल करने का खास मौका नहीं आया। (...)