- เมื่อเซสชัน 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 ความคิดเห็น
ว้าว เป็นฟีเจอร์ที่ไม่เคยเห็นมาก่อนจริง ๆ เลยนะ; ต่อไปนี้ก็คงไม่ต้องปิดเทอร์มินัลแล้วสินะ
ว้าว.. ใช้ SSH มาสิบกว่าปี เพิ่งเคยเห็นฟีเจอร์นี้เป็นครั้งแรก
มีเมนูเด้งขึ้นมาจริง ๆ ด้วย
กำลังหยุดอุปกรณ์
เอ่อ......
ความคิดเห็นจาก 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 (\\~?)\\~\\?ได้เหมือนกันฉันใช้คีย์ลัด
~.มานานแล้ว แต่ไม่เคยรู้ว่ามี เมนูช่วยเหลือถ้าพิมพ์
~สองครั้งก็จะส่งเครื่องหมายทิลดาจริงออกไปได้ และในเซสชันปกติ มันจะไม่ถูกมองเป็น escape ถ้าไม่ได้อยู่ที่อักขระตัวแรกกล่าวคือ
~จะทำงานเป็น escape ก็ต่อเมื่อเป็น อักขระตัวแรกของบรรทัดและอยู่ถัดจากบรรทัดใหม่ทันที เท่านั้น การออกแบบ UI ค่อนข้างละเอียดดีเลยอาจเห็นเอาต์พุตอย่าง
ls ~/^?^?^?^?^?~/a.outได้ SSH เฝ้าดูสตรีมอินพุต ไม่ใช่หน้าจอ~.คุณต้องกด Enter ก่อน ซึ่งอาจถูกส่งไปถึงเซิร์ฟเวอร์ได้ฉันใช้ SSH มามากกว่า 15 ปีแล้ว แต่เพิ่งรู้จัก escape sequence แบบนี้เป็นครั้งแรก
ครั้งหน้าถ้าเซสชันค้าง ฉันจะลอง
~.แน่นอน ดีกว่าปิดเทอร์มินัลทั้งหน้าต่างมากใช้ VPN หรือ Tailscale ก็ช่วยได้ หรือไม่ก็ปรับพารามิเตอร์
tcp_keepaliveเพื่อคงการเชื่อมต่อไว้ตัวอย่างการตั้งค่า: แบบนี้จะช่วยให้เซสชันคงอยู่ได้แม้อยู่ในสภาพแวดล้อม CGNAT
~.ทุกสัปดาห์มา 20 ปีแล้ว และถ้าใส่ออปชัน-vให้ SSH ก็มีประโยชน์กับ การดีบักปัญหาการเชื่อมต่อ มากด้วย~~.เพื่อปิด hop ที่สองได้~.ต้องกด Enter เพื่อขึ้นบรรทัดใหม่ ก่อนเสมอฉันเองก็ใช้
~.มานาน แต่ไม่รู้จัก escape ตัวอื่น ที่หน้า shell prompt มันจะไม่ทำงานทันที ต้องรันcatก่อนแล้วค่อยพิมพ์~?<enter>~.~.ตัดเซสชันมาตลอดเหมือนกัน แต่ไม่รู้ว่า~ทำงานเฉพาะตอนขึ้นบรรทัดใหม่~^Zก็ดูน่าจะมีประโยชน์ทำให้นึกถึง sequence ctrl-[ ของ telnet
Enterแค่ช่วยเตรียมให้เริ่มใส่ escape ใหม่ฟีเจอร์พวกนี้จริง ๆ แล้ว สืบทอดมาจาก rsh คนแก่หน่อยถึงจะจำได้
~มาจาก cu(1) ก่อน มาตั้งแต่ยุค 4.1BSD ก่อน rsh อีกscpแบบ rcp ต้องใส่ออปชัน-Oเมนูของ SSH มีประโยชน์เวลาทำ tunneling ทุกวันนี้อาจถูกแทนที่ด้วยพวก Tailscale บ้าง แต่ก็ยังมีประโยชน์อยู่
มันช่วย multiplexing หลายเซสชัน SSH ไว้บนการเชื่อมต่อเดียว ไม่ต้องยืนยันตัวตนซ้ำ และทำให้ tab completion เร็วขึ้นด้วย
แต่ถ้าการเชื่อมต่อค้างก็จะน่ารำคาญนิดหน่อย
จะเรียกว่า “ความลับ” ก็คงไม่เชิง แต่เป็นฟีเจอร์ที่คนส่วนใหญ่ไม่รู้ เพราะ ไม่ได้อ่าน manpage จนจบ มากกว่า
escape
~ถูกใช้ตั้งแต่ใน UNIX cu ช่วงทศวรรษ 1970 แล้ว จะมองว่า SSH เป็นทายาทของมันก็ได้การตั้งค่า ControlMaster ค่าเริ่มต้นค่อนข้างใช้งานไม่สะดวก ดังนั้นควรเพิ่มบล็อกการตั้งค่าแบบนี้
แบบนี้ SSH/scp/rsync ไปยังโฮสต์เดิมจะ นำการเชื่อมต่อเดิมกลับมาใช้ซ้ำ
และยังเพิ่ม port forwarding ระหว่างเซสชันได้ด้วย escape
~CControlPersistเป็นสัก 1 ชั่วโมง ก็จะช่วยให้การเชื่อมต่อคงอยู่ได้แม้ช่วงเวลาระหว่างการล็อกอินจะสั้นตอนที่เซสชัน SSH ของฉันค้าง ฉันกู้กลับมาได้ด้วย
[Enter] ~.เท่านั้นมันดูเป็น ฟีเจอร์ซ่อนอยู่ ที่ถ้าไม่ใช่คนเชี่ยวชาญลินุกซ์ก็มักจะไม่รู้
ก็พอรู้อยู่แล้ว แต่แทบไม่มีโอกาสได้ใช้เลย (...)