วิธีการเชื่อมต่อกับเซสชัน ssh ที่ไม่ได้เชื่อมต่ออีกครั้ง


156

มีวิธีเชื่อมต่อกับเซสชัน ssh ที่ถูกตัดการเชื่อมต่อหรือไม่? เรากำลังมีปัญหากับการเชื่อมต่อเครือข่ายของเราไปยังไซต์ระยะไกลที่เรากำลังทำงานแยกจากกัน อย่างไรก็ตามในระหว่างนี้เราพบว่ามีการยกเลิกการเชื่อมต่อจำนวนมากเนื่องจากแพ็กเก็ตหายไปในขณะที่เชื่อมต่อกับเซิร์ฟเวอร์ในสถานที่ห่างไกล หลายครั้งที่เซสชันยังทำงานอยู่พักหนึ่งและบางครั้งมันก็อยู่ในระหว่างการดำเนินการบางอย่าง (การแก้ไขไฟล์ใช้กระบวนการบางอย่าง ฯลฯ ) ที่ฉันต้องกลับไปใช้แทนที่จะเริ่มใหม่ถ้าเป็นไปได้


10
ฉันไม่อยากจะเชื่อเลยว่าไม่มีใครพูดถึงmosh.mit.edu
jwbensley

@javano: ฉันไม่เคยได้ยินมาก่อน เพิ่มเป็นคำตอบ!
kbyrd

@kbyrd เสร็จแล้ว)
jwbensley

คำถามที่คล้ายกันถูกถามในunix.stackexchange.com/questions/105001/...ด้วยคำแนะนำบางอย่างเป็นวิธีการทำงานรอบ disconnections ในสถานที่แรก ...
anarcat

คำตอบ:


135

UPDATE: สำหรับคำตอบที่แท้จริงโปรดดูคำตอบของ zero_r ด้านล่าง

นี่ไม่ใช่คำตอบ แต่เป็นวิธีแก้ปัญหา การใช้งานหน้าจอ

เมื่อคุณเข้าสู่ระบบครั้งแรกเรียกใช้หน้าจอ คุณได้เชลล์อีกตัวหนึ่งรันคำสั่งในนั้น หากคุณตัดการเชื่อมต่อกระบวนการหน้าจอจะทำให้เครื่องยังคงทำงานต่อไปเพื่อให้เชลล์และกระบวนการที่กำลังทำงานอยู่ไม่ตกหล่น เมื่อคุณเชื่อมต่อใหม่ให้เรียกใช้ 'screen -r' เพื่อดำเนินการต่อ

มีอีกมากมายที่จะกำหนดค่าและใช้งานหน้าจอ แต่สิ่งที่กล่าวมาข้างต้นควรแก้ไขปัญหาของคุณได้


18
หรือใช้ tmux - หน้าจอ 'เย็นกว่า' ฉันใช้ทั้งคู่และชอบ tmux มากกว่าเพราะคุณสามารถแยกคำได้อย่างสวยงาม
John Hunt

3
ฉันดีใจที่พบว่าscreenติดตั้งแล้วบน Ubuntu 12.x ของฉันดังนั้นหากคุณไม่แน่ใจว่าลองใช้คำสั่งนี้แล้วมันจะทำการเชื่อมต่อใหม่และดำเนินการตามขั้นตอนการอัพเกรดรุ่นต่อไป : หน้าจอ sudo -D -r
bjm88

1
@ bjm88 sudoควรใช้ต่อเมื่อเซสชันหน้าจอดั้งเดิมเริ่มต้นด้วย sudo มิฉะนั้นก็จะกลับเป็นถ้าเซสชั่นหน้าจอไม่มี:There is no screen to be detached
โนม Manos

+1 ฉันรู้ว่านี่ไม่ใช่คำตอบที่แท้จริง แต่screen -rเป็นว่าสิ่งที่ผมกำลังมองหา
Eric Nelson

129

ลองตั้งค่า ClientAliveInterval (เช่น 60) และ TCPKeepAlive (ใช่หรือไม่ใช่) เป็นค่าที่เหมาะสมบนเซิร์ฟเวอร์ sshd.conf

สิ่งนี้จะทำให้เซสชันของคุณยังคงอยู่แม้ว่าการเชื่อมต่อจะหายไปหลายนาที


24
จนถึงตอนนี้คุณดูเหมือนจะเป็นคนเดียวที่ตอบคำถามแทนการแนะนำหน้าจอเป็นวิธีแก้ปัญหา
kbyrd

2
โทรดีมาก เราพบว่าวิธีนี้มีประโยชน์อย่างยิ่งเมื่อทำการข้ามไฟร์วอลล์ cisco ASA / PIX ซึ่งโดยค่าเริ่มต้นความรักที่จะหมดเวลาการเชื่อมต่อ tcp
Mike Pountney

5
บางทีนี่อาจไม่ใช่สถานที่ที่เหมาะสมที่จะถาม แต่เป็นไปได้หรือไม่ที่ผู้โพสต์จะเปลี่ยนคำตอบ? เราควรคำตอบ 'หน้าจอ' (ของฉันไม่ได้ดีที่สุดฉันชอบ Mike Pountney แต่ฉันได้รับตัวแทน) ด้วยข้อมูลนี้
kbyrd

1
สิ่งนี้จะทำงานเมื่อเชื่อมต่อผ่านการเชื่อมต่อ Cisco VPN และการเชื่อมต่อ VPN จะสูญหายและถูกสร้างใหม่
Brent

สำหรับฉันหน้าจอทำงานได้อย่างสมบูรณ์แบบฉันสามารถเชื่อมต่อกับภารกิจที่ถูกคัดเลือกและนับถอยหลังสู่การทำงานอีกครั้ง
integratorIT

64

ดังที่กล่าวไว้ข้างต้นหน้าจอ GNUเป็นวิธีที่จะไป มันจะช่วยให้คุณมี 'เซสชั่นหน้าจอ' ในกล่องระยะไกลที่คุณสามารถเรียกใช้คำสั่งหลายคำสั่งผ่าน 'หน้าจอหน้าต่างหลาย' สิ่งนี้จะแยกออกหากการเชื่อมต่อ SSH แม่ของคุณตายทำให้กระบวนการย่อยทั้งหมดทำงานอยู่ภายในและยังคงอยู่

' man screen' เป็นเพื่อนของคุณตามปกติและควรเรียกแพคเกจระบบปฏิบัติการ ' screen' ถ้าไม่ได้ติดตั้งตามค่าเริ่มต้น

พื้นฐานคือ:

  • เริ่มเซสชันของหน้าจอ (บนรีโมตโฮสต์ของคุณ):

    $ screen
    
  • ตัดการเชื่อมต่อจากเซสชันหน้าจอของคุณ: CTRL-A,d

  • เชื่อมต่อกับเซสชันหน้าจอของคุณอีกครั้งหลังจากลงชื่อเข้าใช้อีกครั้ง:

    $ screen -d -r
    
  • เปิด 'หน้าต่าง' หน้าจออื่น: CTRL-A,c

  • วนรอบหน้าต่างที่คุณเปิดบนหน้าจอ: CTRL-A,space

มีจำนวนมากของสิ่งดีๆที่คุณสามารถทำอะไรกับหน้าจอ ฉันใช้มันมานานกว่า 10 ปีแล้วและยังคงหาคุณสมบัติใหม่อยู่ มันเป็นยูทิลิตี้ Unix ที่ฉันโปรดปราน


1
ใช่นี่เป็นคำตอบที่ดีกว่าของฉันมาก
kbyrd

ฉันยังสามารถเชื่อมต่อกับเซสชัน ssh ที่ไม่ได้เชื่อมต่อได้หรือไม่ถ้าฉันรีบู๊ตพีซีที่หน้าจอกำลังทำงานอยู่
BarathVutukuri

tmux มีประสิทธิภาพมากขึ้น
Pegasus

46

ฉันไม่อยากจะเชื่อเลยว่าไม่มีใครพูดถึงMOSH ;

Mosh เป็นโปรโตคอลแยกที่สามารถขอเข้าสู่กระบวนการเข้าสู่ระบบ SSH มันช่วยให้เซสชันของคุณมีชีวิตหลังจากวันที่ขาดการเชื่อมต่อเปลี่ยน IP, เวลาแฝงสูงและอื่น ๆ มันมีคำอธิบายในหน้าแรกดีกว่าฉันสามารถอธิบายได้ดังนั้นฉันได้คัดลอกคำอธิบายด้านล่าง ประสบการณ์และคำแนะนำของฉันคือฉันใช้มันบนมือถือ Android ของฉันมันช่วยชีวิตเมื่อเดินทางและ SSH'ing เช่นเดียวกันกับแล็ปท็อปของฉันเมื่อเชื่อมโยงกับมือถือบนรถไฟเช่น ฉันขอแนะนำให้รวบรวมจากแหล่งที่มาเพื่อรับรุ่นล่าสุดรุ่น repo สำหรับฉันใน Ubuntu มีความรำคาญเล็กน้อยซึ่งได้รับการแก้ไขในเวอร์ชั่นล่าสุด (ในขณะที่เขียน)

Mosh (เปลือกมือถือ)

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

Mosh แทน SSH มันแข็งแกร่งและตอบสนองได้ดียิ่งขึ้นโดยเฉพาะผ่าน Wi-Fi, เซลลูล่าร์และลิงค์ทางไกล

Mosh เป็นซอฟต์แวร์ฟรีสำหรับ GNU / Linux, FreeBSD, Solaris, Mac OS X และ Android

คุณสมบัติจากเว็บไซต์:

  • เปลี่ยน IP ไม่พลาดการติดต่อ : Mosh ท่องเว็บอัตโนมัติระหว่างที่คุณเชื่อมต่ออินเทอร์เน็ต ใช้ Wi-Fi บนรถไฟ, Ethernet ในโรงแรมและ LTE บนชายหาด: คุณจะยังคงอยู่ในระบบต่อไปโปรแกรมเครือข่ายส่วนใหญ่จะสูญเสียการเชื่อมต่อหลังจากโรมมิ่งรวมถึง SSH และเว็บแอปเช่น Gmail Mosh นั้นแตกต่างกัน

  • ทำให้ฝันดี : ด้วย Mosh คุณสามารถทำให้แล็ปท็อปของคุณเข้าสู่โหมดสลีปและปลุกในภายหลังทำให้การเชื่อมต่อของคุณยังคงอยู่ หากการเชื่อมต่ออินเทอร์เน็ตของคุณลดลง Mosh จะเตือนคุณ - แต่การเชื่อมต่อจะดำเนินต่อเมื่อบริการเครือข่ายกลับมา

  • กำจัดความล่าช้าของเครือข่าย : SSH รอการตอบกลับจากเซิร์ฟเวอร์ก่อนที่จะแสดงการพิมพ์ของคุณเอง ที่สามารถทำเพื่อส่วนติดต่อผู้ใช้หมัด Mosh นั้นแตกต่างกันมันให้การตอบสนองทันทีในการพิมพ์การลบและการแก้ไขบรรทัด มันทำงานได้อย่างปรับตัวและทำงานได้แม้ในโปรแกรมแบบเต็มหน้าจอเช่น emacs และ vim ในการเชื่อมต่อที่ไม่ดีการคาดการณ์ที่โดดเด่นจะถูกขีดเส้นใต้ไว้ดังนั้นคุณจะไม่หลงผิด

  • ไม่มีรหัสพิเศษ ไม่มี daemon : คุณไม่จำเป็นต้องเป็น superuser ในการติดตั้งหรือเรียกใช้ Mosh ไคลเอ็นต์และเซิร์ฟเวอร์สามารถเรียกใช้งานได้โดยผู้ใช้ทั่วไปและมีอายุการใช้งานการเชื่อมต่อนานเท่านั้น

  • วิธีการเข้าสู่ระบบเดียวกัน : Mosh ไม่ฟังพอร์ตเครือข่ายหรือตรวจสอบผู้ใช้ ไคลเอ็นต์ mosh ล็อกอินเข้าสู่เซิร์ฟเวอร์ผ่าน SSH และผู้ใช้นำเสนอข้อมูลประจำตัวเดียวกัน (เช่นรหัสผ่านรหัสสาธารณะ) เหมือนเมื่อก่อน จากนั้น Mosh จะเรียกใช้ mosh-server จากระยะไกลและเชื่อมต่อกับมันผ่าน UDP

  • ทำงานภายในเทอร์มินัลของคุณ แต่ดีกว่า : Mosh เป็นโปรแกรมบรรทัดคำสั่งเช่น ssh คุณสามารถใช้ภายใน xterm, gnome-terminal, urxvt, Terminal.app, iTerm, emacs, หน้าจอหรือ tmux แต่ mosh ได้รับการออกแบบตั้งแต่เริ่มต้นและรองรับชุดอักขระเพียงชุดเดียว: UTF-8 จะแก้ไขข้อบกพร่อง Unicode ในอาคารอื่น ๆ และใน SSH

  • Control-C ใช้งานได้ดี : ไม่เหมือนกับ SSH โปรโตคอล UDP ของ mosh จะจัดการกับการสูญหายของแพ็กเก็ตได้อย่างงดงามและตั้งค่าอัตราเฟรมตามเงื่อนไขเครือข่าย Mosh ไม่ได้เติมบัฟเฟอร์ของเครือข่ายดังนั้น Control-C
    จะทำงานเพื่อหยุดกระบวนการหลบหนี


8
Mosh ไม่ใช่ s wrapper ssh - เป็นโปรโตคอลที่แตกต่างกันเกือบทั้งหมดไม่เกี่ยวข้องกับ ssh (ใช้เพียง ssh เพื่อเข้าสู่ระบบเท่านั้น)
jch

+1 จริงมากความผิดของฉัน
jwbensley

2
สิ่งที่เกี่ยวกับความปลอดภัยคนที่อยู่ตรงกลาง? เข้ารหัส? แลกเปลี่ยนที่สำคัญ?
Nasir Iqbal

ร็อกดูน่ากลัวแม้จะเศร้าไม่สนับสนุนการส่งต่อพอร์ตเลย
Boann

20

autossh ตรวจสอบการเชื่อมต่อของคุณและหากมันลงไปมันจะทำการเชื่อมต่อใหม่ มันมีความน่าเชื่อถือมากกว่า keepalives หากคุณเชื่อมต่อกับเซสชันหน้าจอคุณจะดำเนินการต่อจากที่คุณตัดการเชื่อมต่อ (ดูrscreenว่ามาพร้อมกับ autossh)


1
นอกเหนือจากการตั้งค่าแบบ keep-alive ก็ไม่อนุญาตให้คุณเชื่อมต่อเซสชันอีกครั้ง (สิ่งที่ OP ค้นหา) แต่ autossh จะมีประโยชน์จริงๆสำหรับปพลิเคชันที่จำเป็นต้องมีอุโมงค์ SSH, ทำแผนที่พอร์ต ฯลฯ
อีฟส์

ใช่หน้าจอ autossh + จะเป็นจุดที่น่าสนใจ autossh มีrscreenไว้สำหรับสิ่งนี้
hayalci

Autossh ดีกว่า mosh ฉันใช้ทั้งคู่
Sridhar Sarnobat

นี่คือบล็อกโพสต์โดยเจสคีดเกี่ยวกับการใช้autossh พร้อมกับหน้าจอ
sampablokuper

12

tmux

อันนี้คลาสสิก ใช้ทุกครั้งที่คุณเสี่ยงต่อการสูญเสียการเชื่อมต่อกับเทอร์มินัล

$ tmux
$ sh do_something_that_takes_forever

!! Connection fails so you reconnect once you notice

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0

เช่นเดียวกับที่คุณกลับมาทำงาน


ขอบคุณตัน! ฉันกำลังมองหาวิธีการทำเช่นนี้กับ tmux ตั้งแต่ที่ดูเหมือนจะเป็นสิ่งที่คนส่วนใหญ่ถือว่าเป็นตัวเลือกที่ดีกว่า
CoolOppo

10

ฉันจะติดตั้งและเริ่มต้นหน้าจอเพื่อแก้ไขปัญหาของคุณ หน้าจอจะให้คุณเชื่อมต่อกับเซสชันหน้าจอก่อนหน้าอีกครั้ง

นอกเหนือจากที่หน้าจอนอกจากนี้ยังช่วยให้คุณทำสิ่งที่เย็นเช่นแยกหน้าจอของคุณดูคอนโซล ฯลฯ คุณสามารถหาข้อมูลเพิ่มเติมได้ที่นี่และที่นี่

สำหรับผู้เริ่มต้นหากคุณถูกตัดการเชื่อมต่อคุณสามารถใช้

screen -ls

เพื่อดูเซสชันของคุณและ

screen -r ${session} 

เพื่อเชื่อมต่อกับอีกครั้งที่ไม่ได้เชื่อมต่อ


4

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

คุณสามารถตั้งค่าโปรไฟล์ของคุณบนเครื่องระยะไกลเพื่อเริ่มต้นและ / หรือเชื่อมต่อกับหน้าจออีกครั้งในการเข้าสู่ระบบโดยอัตโนมัติซึ่งช่วยให้คุณลืมหน้าจอเริ่มต้นในครั้งเดียวที่คุณต้องการเพราะคุณประสบปัญหาการเชื่อมต่อลดลง

ดูhttp://tlug.dnho.net/?q=node/239 (หรือค้นหาตัวอย่างอื่น ๆ จาก Google เพื่อหาวิธีที่แตกต่างกันเล็กน้อย)


3

ทางเลือกที่ทันสมัยกว่าสำหรับจอฉายภาพ, ไม่สามารถใช้ได้กับ "virtualisation" บางประเภท (เช่นใน cygwin คุณสามารถมี "หน้าจอ" แต่ไม่ใช่ "tmux" เนื่องจากวิธีการออกแบบ) แต่ทุกที่ที่คุณมีตัวเลือกในการติดตั้ง tmux ฉันขอแนะนำอย่างยิ่งให้ไปที่หน้าจอนั้น


3

นี่คือโซลูชันอื่นที่ไม่ใช่หน้าจอ

Putty Tray ช่วยให้คุณทำเช่นนั้นได้มีการเชื่อมต่อใหม่ในตัวเลือกตัดการเชื่อมต่อที่ไม่ได้อยู่ในปกติหรือ putty-ng

https://puttytray.goeswhere.com/

มันเป็นจุดเริ่มต้นของการฉาบด้วยตัวเลือกอื่น ๆ ไปที่การตั้งค่าการเชื่อมต่อและมี 2 ตัวเลือกหนึ่งตัวสำหรับ 'พยายามเชื่อมต่ออีกครั้งเมื่อการเชื่อมต่อล้มเหลว' และ 'พยายามเชื่อมต่อใหม่เมื่อเริ่มต้น'


1
ehh มันมาพร้อมกับ keylogger และยูทิลิตี้การกรอง ppk อัตโนมัติหรือไม่?
Deer Hunter

1
ฉันสมมติว่าคุณกำลังถามว่ามันขโมยรายละเอียดของคุณมันเป็นโอเพนซอร์สอย่างสมบูรณ์ซอร์สโค้ดมีอยู่ใน github หากคุณต้องการดูgithub.com/FauxFaux/PuTTYTrayมีผู้ร่วมให้ข้อมูลบางส่วน: )
munkiepus

เสียงเชียร์ที่ดี :)
munkiepus

2

ในขณะที่หน้าจอจะทำให้เซสชันเชลล์ของคุณเปิดอยู่บนเซิร์ฟเวอร์ระยะไกลหากเซสชั่น ssh ของคุณลดลง แต่จะไม่ทำอะไรเลยเกี่ยวกับปัญหาการเชื่อมต่อ ssh ที่ถูกทิ้ง ตามที่ zero_r แนะนำให้ลองปรับการเชื่อมต่อ ssh ของคุณด้วย Keep Alives และระยะเวลานาน

ฉันขอแนะนำให้คุณติดตามสาเหตุของแพ็คเก็ตที่หายไปซึ่งก่อให้เกิดปัญหาและแก้ไขปัญหานั้นแทนที่จะแก้ไขปัญหา


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

1
มันจะสร้างเสียงรบกวนมากมาย แต่คุณสามารถลองใช้ ssh ผ่าน strace และดูว่ามันทำอะไร / รายงานเมื่อการเชื่อมต่อ ssh ลดลง มันก็อาจจะรายงานสิ่งที่คุณรู้อยู่แล้วว่า แต่ใครจะรู้ ...
เดวิด

1

บางครั้งฉันก็ลืมเรียกใช้หน้าจอและสูญเสียงานที่ยังไม่เสร็จ ในกรณีนี้แม้ว่าเราไม่สามารถใส่กลับเข้าไปสู่เซสชัน SSH หัก reparenting reptyrโปรแกรมทำงานไปยังอาคารผู้โดยสารแห่งใหม่และกลับมาทำงานในสิ่งที่คุณกำลังทำอยู่ยังคงเป็นไปได้ที่จะขอบคุณ

หลังจากตัดการเชื่อมต่อโดยไม่ได้ตั้งใจจากเซสชัน SSH สิ่งแรกคือการเรียกใช้screenเพื่อมิให้การเชื่อมต่อเสียหายอีกครั้ง จากนั้นในเซสชันใหม่ให้เรียกใช้ps aux | grep {The process to be resumed}PID ด้วย PID คุณสามารถลองreptyr {PID}หรือreptyr -T {PID}(หากมีกระบวนการย่อย) เพื่อทำงานต่อไป

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