ฉันจะแยก ssh ออกเมื่อล็อคได้อย่างไร


380

ฉันมักจะ ssh ลงในกล่องของฉันที่บ้านจากโรงเรียน แต่โดยปกติเมื่อฉันเปลี่ยนชั้นเรียนและคอมพิวเตอร์ของฉันถูกระงับท่อจะถูกทำลาย อย่างไรก็ตาม ssh ล็อค - Ctrl+ c, Ctrl+ zและCtrl+ dไม่มีผล

เป็นเรื่องน่ารำคาญที่ต้องรีสตาร์ทเครื่องของฉันและต้องปิดและสร้างหน้าต่างหน้าจอใหม่อีกครั้ง

ดังนั้นคำถามของฉันมีวิธีง่าย ๆ ที่จะทำให้ ssh ตายอย่างถูกต้องหรือไม่ (เช่นเมื่อท่อล้มเหลว "ปกติ" มันจะออกโดยมีข้อความเกี่ยวกับท่อที่เสียหาย) หรือฉันต้องคิดออกว่า PID คืออะไรและฆ่ามันด้วยตนเองหรือไม่


ถ้าฉันถูกตัดการเชื่อมต่อด้วยเซสชัน SSH ที่ใช้งานอยู่มันจะหยุดทำงาน ฉันเพิ่งฆ่ามันและเริ่มเซสชันใหม่ ไม่มีข้อมูลสูญหายเพราะฉันใช้หน้าจอ GNU
Lekensteyn

ฉันเช่นกัน - หน้าจอดีที่สุด แต่มันก็น่ารำคาญที่ต้องscreen -x: P
Wayne Werner

[mosh] (mosh.mit.edu) เป็นทางเลือกที่เรียบร้อยเพื่อหลีกเลี่ยงปัญหานี้ มัน "เชื่อมต่ออยู่" แม้จะมีการเชื่อมต่ออินเทอร์เน็ตเป็นระยะ
jaynp

@jaynp ข้อเสียของฉันที่ใช้ mosh (ตั้งแต่สองนาทีที่แล้ว) คือฉันไม่รู้วิธียกเลิกการเชื่อมต่อ ฉันใช้เซสชั่น tmux + irssi บนรีโมตโฮสต์ (เป็น IRC bouncer, sort) และฉันต้องการยกเลิกการเชื่อมต่อบางครั้ง (ในขณะที่รักษา tmux + irssi ทำงานอยู่) และฉันทำกับ <enter> + ~ + ใช้ SSH แต่จะไม่ทำงานโดยใช้ mosh
Pavel Šimerda

คำตอบ:


534

ปุ่มปกติจะถูกส่งต่อในsshเซสชันดังนั้นจึงไม่มีปุ่มใดที่จะใช้งานได้ ให้ใช้ลำดับการหลีกเลี่ยงแทน จะฆ่าเซสชันปัจจุบันตีต่อมาEnter ↵, ,~.

เพิ่มเติมของลำดับหนีเหล่านี้จะสามารถจดทะเบียนที่มีEnter ↵, ~, ?:

Supported escape sequences:
  ~.  - terminate session
  ~B  - send a BREAK to the remote system
  ~R  - Request rekey (SSH protocol 2 only)
  ~#  - list forwarded connections
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

enterคุณสามารถปิดรายชื่อลำดับหนีโดยการกดปุ่ม

โปรดสังเกตว่าเนื่องจากการกดปุ่ม~~ทำให้เกิดsshการส่ง~แทนการดักจับคุณสามารถจัดการการเชื่อมต่อที่ซ้อนกันNsshโดยการกดปุ่ม~ Nครั้ง (สิ่งนี้ใช้ได้กับ~s ที่ติดตามโดยตรงenterเท่านั้น) นั่นคือบอกว่าenter~~~~~.จะยกเลิกsshเซสชัน 5 ชั้นลึกและทำให้อีก 4 สมบูรณ์


48
สำหรับรูปแบบแป้นพิมพ์ที่~เป็นกุญแจสำคัญที่ตายแล้วEnter ~ Space .ลำดับที่สำคัญคือ
SørenLøvborg

1
ฉันได้เพิ่มลำดับการหลีกเพิ่มเติมซึ่งอาจมีประโยชน์ :)
gertvdijk

5
โปรดทราบว่าคุณต้องยกเลิกการใส่เครื่องหมายEscapeChar ~ในบรรทัด/etc/ssh/ssh_config(หรือ~/.ssh/ssh_configหากคุณต้องการ)
Aditya MP

6
@Hitechcomputergeek Enter ~ ~ .ตั้งแต่~ ~ส่งตัวอักษร~ผ่านเซสชัน SSH ของคุณเซสชัน SSH ที่สองจะได้รับมันเป็นตัวหนอนตัวเดียวและจะตีความ.ว่าเป็นส่วนหนึ่งของการหลบหนี หากต้องการส่งไปที่เซสชันที่ซ้อนกัน ssh ที่ 5 เพียงใช้ 5 tildes ในลำดับ escape ของคุณ
คะแนน _ ต่ำกว่า

4
การเปลี่ยนแปลงชีวิต;)
artm

54

คุณอาจต้องการตั้งค่าKeep-alivesระดับแอปพลิเคชันสำหรับ SSH เพื่อป้องกันไม่ให้ค้างในปัญหาการเชื่อมต่อ ฉัน~/.ssh/configมีสิ่งนี้:

Host *
ServerAliveInterval 15
# ServerAliveCountMax 3

สิ่งนี้ทำให้ไคลเอนต์ ssh ส่งการรักษาระดับแอปพลิเคชันทุก ๆ 15 วินาที เมื่อใดก็ตามที่พวกเขาสามคนล้มเหลวอย่างต่อเนื่อง (ค่าเริ่มต้นServerAliveCountMax) ลูกค้าจะพิจารณาการเชื่อมต่อว่าหยุดทำงานและปิดลง

ตรงข้ามกับตัวเลือกอื่น ๆTCPKeepAliveนี่คือการตรวจสอบภายในช่องทางเข้ารหัสและไม่สามารถปลอมแปลงได้


มีการตั้งข้อสังเกตว่าการรักษาด้วยยาเหล่านั้นยังช่วยให้การเชื่อมต่อที่ไม่ทำงานเป็นเวลานานเช่นป้องกันคุณจากการปิดการใช้งาน tcp ที่ปิดครึ่งชั่วโมงเป็นเวลาหลายชั่วโมง

ฉันขอแนะนำให้เปิดใช้งานคุณลักษณะนี้หากคุณพบปัญหานี้เป็นประจำ แต่คุณควรทราบเกี่ยวกับความเสี่ยงด้านความปลอดภัยที่อาจเกิดขึ้น การโจมตีที่รู้จักธรรมดาอาจง่ายขึ้นหากผู้โจมตีทราบช่วงเวลาและเนื้อหาของการเชื่อมต่อที่ไม่ได้ใช้งาน นี่อาจเป็นสาเหตุที่ทำให้ไม่มีการเปิดใช้งานตามค่าเริ่มต้น


3
เหตุผลด้านความปลอดภัย คุณสามารถไปดื่มและเปิดทิ้งไว้ sessio และหุ้นส่วนห้องแล็บของคุณที่คุณทำงานด้วยใน 20 ปีที่ผ่านมาอาจใช้เซสชันของคุณเพื่อจี้เซิร์ฟเวอร์และทำลายมัน ... ในขณะที่คุณดื่มในช่วงพัก 10 นาที
Luis Alvarado

2
@CYREX ใช่มั้ย และจะปิดตัวเลือกโดยค่าเริ่มต้นเพื่อป้องกันไม่ให้คุณมีพันธมิตรห้องปฏิบัติการที่ไม่เป็นธรรมได้อย่างไร %)
ulidtko

1
@ulidtko: มีเหตุผลใดที่ไม่ได้ตั้งค่าServerAliveIntervalเป็น 1 เพื่อให้ตรวจพบการเชื่อมต่อที่หายไปทันทีหรือไม่?
krlmlr

2
@gertvdijk: ขอบคุณ สำหรับฉันมันใช้งานได้แม้ไม่มีHostสาย นอกจากนี้ "การเข้ารหัสโมเดิร์นเช่นมาตรฐานการเข้ารหัสขั้นสูงในปัจจุบันยังไม่ไวต่อการโจมตีที่รู้จักธรรมดา" (จากลิงก์ที่คุณเพิ่ม) ...
krlmlr

2
คุณสามารถแทนที่ SSH ด้วย Mosh (mobile shell) ได้ Mosh เชื่อมต่อกับเซิร์ฟเวอร์ผ่าน SSH แต่จากนั้นสร้างช่องสัญญาณที่ใช้ UDP ซึ่งสามารถรองรับปัญหาการเชื่อมต่อได้ Mosh มีเสียงสะท้อนในเครื่องด้วยดังนั้นคุณสามารถเห็นสิ่งที่คุณกำลังพิมพ์แม้ว่าเซิร์ฟเวอร์ไม่ตอบรับ เมื่อกดแป้นส่งแล้ว Mosh จะทำเครื่องหมายข้อความที่สะท้อนออกมา mosh.mit.edu
Pascal Rosin

41

ดังที่ระบุไว้ในคำตอบของ geekosaur ลำดับ escape ~.จะยุติการเชื่อมต่อ

รายการลำดับการยกเว้นทั้งหมดและสิ่งที่สามารถทำได้โดยการพิมพ์~?:

Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^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.)

ฉันจะปิดรายการลำดับหลีกเลี่ยงได้อย่างไร
kristianp

3
คุณไม่หลังจากพิมพ์รายการลำดับหนีแล้วมันพร้อมที่จะยอมรับรายการถัดไป
Tejas Kale
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.