54 คะแนน โดย GN⁺ 2026-03-13 | 5 ความคิดเห็น | แชร์ทาง WhatsApp
  • เมื่อเซสชัน SSH ค้าง คุณสามารถควบคุมได้หลายอย่างผ่าน เมนู escape sequence ที่ฝังมาใน SSH โดยไม่ต้องบังคับ kill โปรเซส
  • ภายในเซสชัน ให้กด ↵Enter แล้วพิมพ์ ~? เพื่อแสดง รายการคำสั่งที่ซ่อนอยู่ และใช้ ~. เพื่อตัดการเชื่อมต่อได้ทันทีไม่ว่าสถานการณ์ไหน
  • escape sequence นี้ฝังอยู่ในตัว SSH client เอง จึง ทำงานได้แม้เซิร์ฟเวอร์จะไม่ตอบสนองหรือการเชื่อมต่อขาดหาย
  • ในเซสชัน SSH แบบซ้อนกัน สามารถใช้ ~~ เพื่อ ส่ง sequence ไปยังไคลเอนต์ชั้นใน ได้
  • นอกจากนี้ยังแนะนำ ออปชัน SSH ที่มีประโยชน์ อย่าง -C, -v, -D ด้วย

เมนู SSH escape sequence

  • ในเซสชัน SSH ให้กด ↵Enter แล้วพิมพ์ ~? เพื่อดู รายการ escape sequence ที่รองรับ
  • รายการ sequence หลัก:
    • ~. — ตัดการเชื่อมต่อ (รวมถึงเซสชันที่ถูก multiplex)
    • ~B — ส่ง สัญญาณ BREAK ไปยังระบบปลายทาง
    • ~C — เปิด command line (สามารถตั้งค่า port forwarding ได้ และพิมพ์ help เพื่อดูคำแนะนำ)
    • ~R — ขอ rekey
    • ~V/v — เพิ่ม/ลด verbosity (LogLevel)
    • ~^Zพักการทำงาน SSH (suspend)
    • ~# — แสดงรายการการเชื่อมต่อที่ถูก forward อยู่
    • ~& — ส่ง SSH ไปทำงาน เบื้องหลัง (ระหว่างรอการเชื่อมต่อปิด)
    • ~~ — ส่งอักขระ escape เองออกไป (พิมพ์สองครั้ง)
  • sequence เหล่านี้ ฝังอยู่ในตัว SSH client เอง จึงทำงานได้แม้ SSH server จะไม่ตอบสนองหรือการเชื่อมต่อหลุดไปแล้ว
  • ตัวที่มีประโยชน์ที่สุดคือ ~. ซึ่งช่วย ปิดเซสชันได้ทันทีในทุกสถานการณ์ เมื่อเซสชันค้าง
  • escape sequence จะถูกจดจำได้ เฉพาะทันทีหลังขึ้นบรรทัดใหม่ (newline) เท่านั้น

การใช้งานในเซสชัน SSH แบบซ้อนกัน

  • ในสภาพแวดล้อมแบบซ้อนที่เข้า SSH อยู่แล้วแล้วต่อ SSH ซ้ำอีกชั้น สามารถใช้ ~~ เพื่อส่ง sequence ไปยังไคลเอนต์ชั้นในได้
  • ตัวอย่าง:
  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 อยู่
  • เมื่อพิมพ์ ~~. จะปิดเฉพาะ เซสชันชั้นในสุด (manehatten) แล้วกลับไปที่ ponyville
  • เมื่อพิมพ์ ~. จะปิดถึง เซสชันชั้นกลาง (ponyville) แล้วกลับไปที่ stable

ออปชัน SSH เพิ่มเติมที่น่าสนใจ

  • ssh -C — เปิดใช้ การบีบอัด gzip ตามเอกสารอาจบอกว่าไม่จำเป็นบนเครือข่ายที่เร็ว แต่เวลาใช้ TUI หรือแสดงล็อกปริมาณมาก จะช่วย ลด latency และเพิ่มความลื่นไหลในการตอบสนอง ได้มาก
  • ssh -v — เปิดใช้ ล็อกแบบละเอียด (-vv, -vvv เพื่อแสดงข้อมูลเพิ่มขึ้นได้) มีประโยชน์ในการแยกว่าเชื่อมต่อช้าหรือเหมือนค้าง โดยเฉพาะเวลาต่อไปยังอุปกรณ์ช้าอย่าง Raspberry Pi
  • ssh -D 1234 — สร้าง SOCKS proxy ที่ localhost:1234 ทำให้เข้าถึงผ่านเครือข่ายของเซิร์ฟเวอร์ได้ จึงใช้ทำงานบน LAN ฝั่งเซิร์ฟเวอร์หรือทำ DIY VPN แบบง่ายๆ ได้

5 ความคิดเห็น

 
t7vonn 2026-03-13

ว้าว เป็นฟีเจอร์ที่ไม่เคยเห็นมาก่อนจริง ๆ เลยนะ; ต่อไปนี้ก็คงไม่ต้องปิดเทอร์มินัลแล้วสินะ

 
xguru 2026-03-13

ว้าว.. ใช้ SSH มาสิบกว่าปี เพิ่งเคยเห็นฟีเจอร์นี้เป็นครั้งแรก
มีเมนูเด้งขึ้นมาจริง ๆ ด้วย

 
bus710 2026-03-13

กำลังหยุดอุปกรณ์
เอ่อ......

 
GN⁺ 2026-03-13
ความคิดเห็นจาก Hacker News
  • ฉันพยายามปกป้อง manpage แบบเต็มที่มาโดยตลอด manpage ของโอเพนซอร์สส่วนใหญ่มีคุณภาพสูง และบางอันก็ดีเยี่ยมจริง ๆ
    แต่ตัวเครื่องมือ man เองมีปัญหา ตัวอย่างเช่น ฉันพยายามหาไวยากรณ์ escape อย่าง ~? ของไคลเอนต์ openssh แต่ค้นหาใน manpage ไม่เจอ
    สาเหตุคือ man เปลี่ยนอักขระ ~ ให้เป็นเครื่องหมายทิลดา Unicode แปลก ๆ ทำให้ grep ไม่ได้อีกต่อไป อักขระ - ก็ถูกแปลงเหมือนกันจนค้นหาไม่เจอ
    สำหรับ เอกสารของเครื่องมือบรรทัดคำสั่ง นี่ถือว่าร้ายแรงมาก ฟีเจอร์การแปลงแบบนี้ควรถูกปิดไว้เป็นค่าเริ่มต้น

    • ฉันไม่รู้เรื่องปัญหาการแปลงอักขระ แต่กด ctrl-r เพื่อ ค้นหาแบบตามตัวอักษร ได้ (/<ctrl-r>~?)
    • ใน less ซึ่งเป็น pager ค่าเริ่มต้นของ Debian มันทำงานได้ดี
    • ฉันแก้ได้ด้วยออปชัน man -E ascii สภาพแวดล้อมของฉันคือ Cygwin 3.6.6 เลยอาจเป็นความต่างของดิสโทร
    • ถ้าใช้ neovim เป็น pager จะค้นหา ~? ได้ดี แต่ต้องรู้การ escape regex (\\~?)
    • บน macOS และ CentOS ก็ค้นหา \\~\\? ได้เหมือนกัน
  • ฉันใช้คีย์ลัด ~. มานานแล้ว แต่ไม่เคยรู้ว่ามี เมนูช่วยเหลือ
    ถ้าพิมพ์ ~ สองครั้งก็จะส่งเครื่องหมายทิลดาจริงออกไปได้ และในเซสชันปกติ มันจะไม่ถูกมองเป็น escape ถ้าไม่ได้อยู่ที่อักขระตัวแรก
    กล่าวคือ ~ จะทำงานเป็น escape ก็ต่อเมื่อเป็น อักขระตัวแรกของบรรทัดและอยู่ถัดจากบรรทัดใหม่ทันที เท่านั้น การออกแบบ UI ค่อนข้างละเอียดดี

    • อธิบายสำหรับผู้อ่านอายุน้อยหน่อย ใน โหมด echo ของเทอร์มินัล ปุ่ม backspace ไม่ได้ลบจากบัฟเฟอร์อินพุตจริง ๆ
      เลยอาจเห็นเอาต์พุตอย่าง ls ~/^?^?^?^?^?~/a.out ได้ SSH เฝ้าดูสตรีมอินพุต ไม่ใช่หน้าจอ
    • ข้อเสียคือถ้าเซสชันค้าง แล้วอยากออกด้วย ~. คุณต้องกด Enter ก่อน ซึ่งอาจถูกส่งไปถึงเซิร์ฟเวอร์ได้
  • ฉันใช้ SSH มามากกว่า 15 ปีแล้ว แต่เพิ่งรู้จัก escape sequence แบบนี้เป็นครั้งแรก
    ครั้งหน้าถ้าเซสชันค้าง ฉันจะลอง ~. แน่นอน ดีกว่าปิดเทอร์มินัลทั้งหน้าต่างมาก

    • ถ้า SSH หลุดบ่อย อาจเป็นเพราะ TCP timeout ของ CGNAT ที่สั้น
      ใช้ VPN หรือ Tailscale ก็ช่วยได้ หรือไม่ก็ปรับพารามิเตอร์ tcp_keepalive เพื่อคงการเชื่อมต่อไว้
      ตัวอย่างการตั้งค่า:
      net.ipv4.tcp_keepalive_time=240
      net.ipv4.tcp_keepalive_intvl=60
      net.ipv4.tcp_keepalive_probes=120
      
      แบบนี้จะช่วยให้เซสชันคงอยู่ได้แม้อยู่ในสภาพแวดล้อม CGNAT
    • ฉันใช้ ~. ทุกสัปดาห์มา 20 ปีแล้ว และถ้าใส่ออปชัน -v ให้ SSH ก็มีประโยชน์กับ การดีบักปัญหาการเชื่อมต่อ มากด้วย
    • ถ้าต่อ SSH หลายชั้น ก็ใช้ ~~. เพื่อปิด hop ที่สองได้
    • ฉันเองก็ใช้มาเกือบ 30 ปีแล้ว และก่อนหน้านั้นก็ใช้ rsh ดู Berkeley r-commands
    • ก่อนพิมพ์ ~. ต้องกด Enter เพื่อขึ้นบรรทัดใหม่ ก่อนเสมอ
  • ฉันเองก็ใช้ ~. มานาน แต่ไม่รู้จัก escape ตัวอื่น ที่หน้า shell prompt มันจะไม่ทำงานทันที ต้องรัน cat ก่อนแล้วค่อยพิมพ์ ~?

    • มันยังทำงานอยู่ OpenSSH เฝ้าดู อินพุตเท่านั้น ไม่ใช่เอาต์พุต ดังนั้นออกได้ด้วย <enter>~.
    • ฉันก็ใช้ ~. ตัดเซสชันมาตลอดเหมือนกัน แต่ไม่รู้ว่า ~ ทำงานเฉพาะตอนขึ้นบรรทัดใหม่ ~^Z ก็ดูน่าจะมีประโยชน์
      ทำให้นึกถึง sequence ctrl-[ ของ telnet
    • ไคลเอนต์ SSH รับรู้ escape ได้แม้จะไม่รู้โหมดของเซสชันฝั่งรีโมต โดย Enter แค่ช่วยเตรียมให้เริ่มใส่ escape ใหม่
  • ฟีเจอร์พวกนี้จริง ๆ แล้ว สืบทอดมาจาก rsh คนแก่หน่อยถึงจะจำได้

    • จริง ๆ แล้วสไตล์คำสั่ง ~ มาจาก cu(1) ก่อน มาตั้งแต่ยุค 4.1BSD ก่อน rsh อีก
    • เดี๋ยวนี้ถ้าอยากใช้ scp แบบ rcp ต้องใส่ออปชัน -O
    • ในฐานะคนที่ยังจำยุค uucp!bangpath ได้ ก็อดขำไม่ได้
  • เมนูของ SSH มีประโยชน์เวลาทำ tunneling ทุกวันนี้อาจถูกแทนที่ด้วยพวก Tailscale บ้าง แต่ก็ยังมีประโยชน์อยู่

    • ตอนเปิด “การเชื่อมต่อใหม่” ในแท็บใหม่ ฉันใช้ฟีเจอร์ ControlMaster
      มันช่วย multiplexing หลายเซสชัน SSH ไว้บนการเชื่อมต่อเดียว ไม่ต้องยืนยันตัวตนซ้ำ และทำให้ tab completion เร็วขึ้นด้วย
      แต่ถ้าการเชื่อมต่อค้างก็จะน่ารำคาญนิดหน่อย
    • ฉันใช้ tuns.sh บ่อย มันสะดวกเพราะเอา localhost ออกไปเปิดให้ภายนอกเข้าถึงได้
  • จะเรียกว่า “ความลับ” ก็คงไม่เชิง แต่เป็นฟีเจอร์ที่คนส่วนใหญ่ไม่รู้ เพราะ ไม่ได้อ่าน manpage จนจบ มากกว่า

  • escape ~ ถูกใช้ตั้งแต่ใน UNIX cu ช่วงทศวรรษ 1970 แล้ว จะมองว่า SSH เป็นทายาทของมันก็ได้

  • การตั้งค่า ControlMaster ค่าเริ่มต้นค่อนข้างใช้งานไม่สะดวก ดังนั้นควรเพิ่มบล็อกการตั้งค่าแบบนี้

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

    แบบนี้ SSH/scp/rsync ไปยังโฮสต์เดิมจะ นำการเชื่อมต่อเดิมกลับมาใช้ซ้ำ
    และยังเพิ่ม port forwarding ระหว่างเซสชันได้ด้วย escape ~C

    • ถ้าเพิ่ม ControlPersist เป็นสัก 1 ชั่วโมง ก็จะช่วยให้การเชื่อมต่อคงอยู่ได้แม้ช่วงเวลาระหว่างการล็อกอินจะสั้น
    • มีคนแซวด้วยว่าคอมเมนต์นี้ เหมือน LLM เป็นคนเขียน
  • ตอนที่เซสชัน SSH ของฉันค้าง ฉันกู้กลับมาได้ด้วย [Enter] ~. เท่านั้น
    มันดูเป็น ฟีเจอร์ซ่อนอยู่ ที่ถ้าไม่ใช่คนเชี่ยวชาญลินุกซ์ก็มักจะไม่รู้

 
kayws426 2026-03-13

ก็พอรู้อยู่แล้ว แต่แทบไม่มีโอกาสได้ใช้เลย (...)