รันคำสั่ง Resume ต่อในเซสชัน SSH ที่ถูกดร็อป


32

การอ่านคำถามนี้ทำให้ฉันสงสัย สมมติว่าscreenไม่มีการใช้งาน หากเซสชัน SSH บนเป้าหมาย Linux ถูกดร็อปไม่ว่าด้วยเหตุผลใดก็ตามและคุณเชื่อมต่อใหม่ก่อนที่เซิร์ฟเวอร์จะฆ่าเซสชันเนื่องจากการหมดเวลาเป็นไปได้หรือไม่ที่คุณจะสามารถควบคุมคำสั่งที่รันอยู่อีกครั้งได้ ?


คำสั่งมันคืออะไร? ฉันคาดเดาโดยทั่วไปคำตอบคือไม่
davr

ไม่มีคำสั่งเฉพาะฉันแค่ถามว่าเป็นแนวคิดทั่วไป
John Gardeniers

1
คนที่มีความเข้าใจที่ครอบคลุมเกี่ยวกับวิธีการเริ่มต้นเซสชัน tty อาจบอกเราได้ว่า ดูเหมือนว่าถ้าคุณสามารถสร้างเซสชันใหม่บน tty เดียวกันและกำหนด PPID ก่อนหน้านี้อย่างชัดเจนอาจเป็นไปได้ ฉันแค่รอปราชญ์ห้ามเคราบางคนที่จะมาพร้อมและระเบิดความคิดของเรา นั่นคือความฝัน แต่อย่างใด
CarpeNoctem

จะเกิดอะไรขึ้นถ้าคุณทดลองใช้แล็ปท็อปที่ต่อพ่วงและดึงสายอีเธอร์เน็ตออกมา
พอล

@ ~ drpaulbrewer - เหมือนกับเมื่อคุณทำกับเครื่องเดสก์ท็อป - การเชื่อมต่อถูกตัด การเชื่อมต่อถูกตัดไม่เกี่ยวข้องกับคำถามอย่างไร
John Gardeniers

คำตอบ:


13

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

เป็นไปได้หรือไม่ฉันต้องการเดิมพันว่ามันเป็นที่พึงปรารถนามากกว่าที่จะปล่อยให้กระบวนการที่ถูกทอดทิ้งถูกฆ่า "โดยธรรมชาติ" หากคุณกำลังทำสิ่งที่สำคัญพอที่จะพิสูจน์ว่าพยายามทำแฮ็กเกอร์ทั้งหมดที่ต้องการเพื่อควบคุมต่อและคุณอยู่ในลิงค์ที่ไม่เสถียรคุณควรรู้ว่าล่วงหน้าและใช้หน้าจอ (หรือ vnc หรือสิ่งใดก็ตามที่ลอยอยู่) เรือควบคุม) :)


ฉันพบว่ามันยากที่จะเลือกคำตอบที่จะยอมรับดังนั้นฉันจึงยอมรับคำตอบนี้เพราะในขณะนี้มันเป็นคำตอบเดียวที่มี upvote
John Gardeniers

5

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันรู้สึกว่าเป็นสิ่งสำคัญที่จะเพิ่มการค้นพบของฉันในกรณีที่มีคนอื่นเจอสิ่งนี้เช่นฉัน

ฉันไม่ได้เห็นผลที่ผิดปกติใด ๆ ในการทำเช่นนี้ แต่นี่คือสิ่งที่ฉันใช้และมันทำงานได้อย่างน่าอัศจรรย์ บางครั้งเมื่อเราเรียกใช้กระบวนการที่ยาวนานบนเซิร์ฟเวอร์ของเรามันจะตัดการเชื่อมต่อเซสชัน ssh ในบางครั้ง กระบวนการพร้อมกับเซสชัน tty นั้นยังคงทำงานต่อไป แต่เราไม่สามารถเชื่อมต่อได้ ฉันพบโปรแกรมด้านล่างเพื่อดึงกระบวนการไปยังเซสชันที่เชื่อมต่อใหม่

https://github.com/nelhage/reptyr

นี่คือข้อมูลเพิ่มเติม

https://blog.nelhage.com/2011/02/changing-ctty/


5
ยินดีต้อนรับสู่ Server Fault! ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
EEAA

ขอบคุณ @ user215086! น่าแปลกใจที่สิ่งนี้ใช้ได้ผล! ฉันกำลังแก้ไขไฟล์ config ยาว ๆ สักครู่เพิ่มการตั้งค่าที่กำหนดเองจำนวนมากและความคิดเห็นที่เขียนอย่างละเอียดและเกือบจะเสร็จสิ้นเมื่อการเชื่อมต่อลดลง! "Noooooo !! ... " หลังจากฉันตะโกนหยาบคายที่เพดานฉันติดตั้ง reptyr และ voila! ฉันกู้คืนเซสชั่น ssh ที่ฉันทิ้งไว้ยังอยู่ในตัวแก้ไขเสร็จบางสิ่งบันทึกเสร็จแล้ว !! WooHoo! reptyr น่ากลัว
ColdCold

4

โดยทั่วไปวิธีที่เหมาะสมในการจัดการสิ่งนี้คือการเตรียมตัวล่วงหน้าโดยใช้ GNU screenหรือทุบตีnohupหรือdisownกลไก หากคุณกำลังใช้tcshเชลล์จะปฏิเสธงานพื้นหลังเมื่อออกจากระบบอย่างผิดปกติ

หากคุณไม่ได้ใช้screenแต่มีการจัดการเพื่อให้กระบวนการของคุณทำงานผ่านหนึ่งในวิธีการปฏิเสธคุณอาจปลอมเชื่อมต่อกับกระบวนการด้วยgdb(ที่มา ):

[... ] กับแฮ็กสกปรกบางอย่างมันเป็นไปไม่ได้ที่จะเปิดกระบวนการ 'stdout / stderr / stdin อีกครั้ง [ ... ]

จากนั้นใช้ gdb เพื่อแนบกับกระบวนการให้ทำการโทรปิด (0)
ปิดการโทร (1)
ปิดการโทร (2)
เปิดสาย ("/ dev / pts / xx", ... )
โทรซ้ำ (0)
โทร dup (0)
detach

ตอนนี้คุณต้องปรับแต่งกระบวนการนี้สำหรับสถานการณ์ของคุณ ฉันสงสัยว่ามันจะช่วยถ้าคุณยังไม่ได้จัดการเพื่อปฏิเสธกระบวนการ หากคุณกำลังใช้bash, เห็นโพสต์นี้เกี่ยวกับการทำทุบตีโดยอัตโนมัติปฏิเสธกระบวนการพื้นหลังเมื่อออก (พื้นปิดhuponexitกับshopt ) ด้วยกระบวนการเบื้องหน้าคุณจำเป็นต้องมีสินค้าnohup


1

อาจจะไม่. ฉันไม่สามารถรับประกันได้ว่ามันเป็นไปไม่ได้ แต่ฉันสงสัยจริงๆ

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

แต่สมมติว่าคุณเริ่มssh somehost nuhup vim /some/fileและการเชื่อมต่อจะตาย คุณรันssh somehostเพื่อเข้าสู่ระบบอีกครั้งและจะเห็นว่ากระบวนการ vim ของคุณยังคงทำงานอยู่ แต่คุณจะเชื่อมต่อกับกระบวนการนั้นอีกครั้งได้อย่างไร กระบวนการ forground แบบโต้ตอบมีการควบคุมttyและหนึ่งที่เปิดสำหรับกระบวนการ vim ของคุณเมื่อมันเริ่มจะตั้งแต่นั้นถูกปิด ฉันไม่แน่ใจว่ามีวิธี "เปิดใหม่" อีกครั้งในเชลล์ใหม่ของคุณหรือไม่ (เหมือนกับว่าคุณมีงานแบ็คกราวน์หลายงานที่รันในเชลล์หนึ่งคุณไม่สามารถทำงานใด ๆ ของเชลล์ในเชลล์อีกอัน)

Screenมีการเขียนอย่างชัดเจนว่ามีฟังก์ชั่นนี้ เมื่อเริ่มต้นระบบจะทำการดำเนินการสองกระบวนการกระบวนการจัดการเทอร์มินัลและกระบวนการไคลเอ็นต์ การโต้ตอบคือแอปพลิเคชัน terminal manager ของไคลเอ็นต์ <--> และเมื่อคุณแยกหรือเชื่อมต่อขาดกระบวนการไคลเอนต์จะหยุดทำงานในขณะที่ terminal manager ยังคงทำงานต่อไป หน้าจอมีการสนับสนุนเฉพาะบางอย่างเพื่อแนบกับกระบวนการจัดการเทอร์มินัลอีกครั้งในภายหลังและฉันไม่คิดว่ามันเป็นไปได้ในกรณีทั่วไป


ขอบคุณ นั่นเป็นสิ่งที่ฉันคาดไว้มาก ลองดูว่ามีใครสามารถพิสูจน์เราผิด ;)
John Gardeniers

ฉันได้เรียนรู้ตั้งแต่เขียนคำตอบนี้ว่ามีโปรแกรมreptyrสำหรับกระบวนการ "re-ptying" ในทางทฤษฎีทำได้ แต่ฉันยังคงคิดว่าคำตอบโดยรวมน่าจะไม่
hlovdal

1

Rettyอาจช่วยคุณได้ แต่คนปฏิเสธความรับผิดชอบนั้นเป็นของจริงและมีความเกี่ยวข้อง :)


1

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


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

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

0

มีลิงก์ไปยังรหัสขโมยแฮ็ก tty ในคำถามนี้ ในทางทฤษฎีคุณควรสามารถใช้สิ่งนี้เพื่อควบคุมกระบวนการ nohup อีกครั้ง


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