ฉันจะเชื่อมต่อเซสชัน ssh อีกครั้งหลังจากที่ไปป์ที่ขาดได้อย่างไร


28

ดังนั้นฉันจึงทำงานapt-get upgradeบนเซิร์ฟเวอร์เมื่อเราเตอร์ตัดสินใจแล้วว่ามันนานเกินไปเพราะมันทำให้ฉันโกรธครั้งสุดท้าย: มันขาดการเชื่อมต่อทั้งหมด คุณธรรมของเรื่องราวคือการใช้งานscreenมากเมื่อคุณอยู่บนเราเตอร์ bum

อย่างไรก็ตามฉันกลับเข้าสู่ระบบและพบในฮ็อพที่กระบวนการยังคงแขวนอยู่ที่นั่นยังคงรอ Y / n ของฉันที่จะอัพเกรด (ยังไม่ได้ตีมันโชคดี) มีวิธีใดบ้างที่ฉันจะสามารถกลับไปที่เซสชันที่ใช้งานไม่ได้ ฉันลงเอยด้วยการฆ่ามันเพราะมันไม่ได้อยู่ในช่วงกลางของการจัดการบรรจุภัณฑ์ แต่มันจะเป็นการดีสำหรับการอ้างอิงในอนาคต


1
ฉันประหลาดใจที่apt-getกระบวนการยังคงทำงานอยู่ มันควรจะตายไปพร้อม ๆ กับกระบวนการทั้งหมดจนถึง SSH ฉันสังเกตเห็นว่าdo-dist-upgradeเริ่มโดยอัตโนมัติในscreen/ byobuเซสชัน: ในบางสถานการณ์อาจapt-getทำเช่นเดียวกัน?
nfirvine

คำตอบ:


16

คำตอบสำหรับคำถามที่เหมาะสมของคุณคือ: คุณไม่สามารถ ฉันคิดว่าปัญหาหลักคือขั้นตอนการตรวจสอบสิทธิ์จะไม่ซิงค์กัน มันไม่ทำงานอย่างนั้น

ตามที่คุณสังเกตเห็นตัวเองวิธีการแก้ปัญหาคือการใช้หน้าจอเมื่อเป็นไปได้ (โดยวิธีtmuxเป็นทางเลือกที่หน้าจอ)


1
แต่ถ้าคุณมีรหัสผ่าน ssh? คุณสามารถทำมันได้หรือไม่
Sridhar Sarnobat

1
byobuเป็นดีและง่ายต่อการใช้ส่วนหน้าscreen(หรือtmux) - คุ้มค่าดูแน่นอน (:
drevicko

Sridhar-Samobol, การตรวจสอบยังคงต้องเกิดขึ้น การเชื่อมต่อกับเซสชันที่ทำงานอยู่ไม่มีวิธีที่จะจับมือเริ่มต้นอีกครั้งดังนั้นค่าคงที่จะหักถ้าเราแนะนำเซสชันใหม่ลงในเซสชันที่มีอยู่ คำตอบ: ไม่
kevr

9

สำหรับการรันกระบวนการที่ยาวนานฉันใช้หน้าจอหรือbyobuหากคุณต้องการอินเตอร์เฟสที่เป็นมิตรมากกว่า

สำหรับหน้าจอคุณสามารถใช้:

screen [program] [args]

สิ่งนี้จะเรียกใช้ [โปรแกรม] และ [args] ภายในเซสชันหน้าจอ เมื่อโปรแกรมเสร็จสิ้นเซสชันจะถูกปิดโดยอัตโนมัติ หากคุณต้องการเก็บเซสชันไว้หลังจากที่โปรแกรมของคุณรันเพียงแค่รันหน้าจอโดยไม่มีข้อโต้แย้งใด ๆ และจะมีพรอมต์ใหม่ปรากฏขึ้นภายในเซสชัน CTRL + A + Dแยกเทอร์มินัลออกจากเซสชันปัจจุบัน

หากต้องการแนบไปกับเซสชันก่อนหน้าอีกครั้ง:

screen -r

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

Byobuเป็นการปรับปรุงที่ดี มันขึ้นอยู่กับหน้าจอแต่มีแถบที่ด้านล่างที่แสดงเซสชันปัจจุบันทั้งหมดเป็นแท็บและให้ทางลัดที่ง่ายกว่าในการย้ายไปรอบ ๆ คุณสามารถ:

  • F2 เริ่มเซสชันใหม่
  • F3 เลื่อนไปที่แท็บเซสชันถัดไปทางซ้าย
  • F4 เลื่อนไปที่แท็บเซสชันถัดไปทางด้านขวา
  • F8 ตั้งชื่อให้เป็นมิตรกับแท็บเซสชันปัจจุบัน
  • F9 เปิดเมนูตัวเลือก
  • CTRL + A + D แยกเซสชันทั้งหมดออกจากเทอร์มินัล

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


1
ฉันขออ้างอิง OP: "คุณธรรมของเรื่องคือการใช้หน้าจอมาก" เห็นได้ชัดว่าไม่ใช่คำถามที่นี่
มกราคม

ขอบคุณสำหรับการเขียน แต่มกราคมถูกต้อง

ใช้หน้าจอ sudo <command> เพื่อตั้งค่าหน้าจอเป็นรูทซึ่งต้องการการเข้าถึง sudo เพื่อเชื่อมต่อใหม่ ดีกว่าเริ่มหน้าจอตามปกติแล้วเปลี่ยนเป็นรูทภายใน
djsmiley2k - CoW

8

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

คำแนะนำ

ในกรณีของคุณคุณจะเข้าควบคุมapt-getกระบวนการจากเซสชัน SSH เซสชันใหม่screenหรือสิ่งที่คล้ายกัน สิ่งที่ฉันชอบมากที่สุดคือreptyrคำสั่ง:

$ sudo apt-get install reptyr
$ ps ax | grep apt-get
10626 pts/8   R+     0:32 apt-get upgrade

จากนั้นด้วย pid ที่คุณพบสำหรับกระบวนการของคุณ:

$ sudo reptyr -T 10626

หรือหากวิธีนี้ใช้ไม่ได้ให้ลอง:

$ reptyr 10626

หลังจากขั้นตอนนี้คีย์บอร์ดของคุณจะเข้าสู่โปรแกรมที่คุณเข้าควบคุม น่าเสียดายที่คุณจะไม่เห็นผลลัพธ์เก่าของเซสชัน SSH เช่นapt-getผลลัพธ์ที่ขอให้คุณยืนยัน

คำอธิบาย

มีเครื่องมืออื่น ๆ อีกมากมายที่ทำงานเหมือนกับreptyr(โดยผ่านการptraceแนบดีบั๊ก) ดูคำถามและคำตอบต่อไปนี้ที่กล่าวถึง:

ในคำแนะนำข้างต้นการreptyr 10626ใช้ptracedebug Attachment ในขณะที่sudo reptyr -T 10626คำสั่งใช้การขโมย TTY และเป็นที่นิยม ( รายละเอียด )

ท้ายที่สุดเหตุผลที่คุณไม่สามารถเข้าร่วมเซสชัน SSH ด้วยวิธีนี้ได้เนื่องจากsshdกระบวนการไม่ได้ถูกควบคุมโดยโฮสต์เทอร์มินัลแทนจะให้ส่วนทาสของเทอร์มินัล - ptsอุปกรณ์ - ในขณะที่ส่วนหลักที่ควบคุมมันอยู่บน เครื่องไคลเอนต์ที่นี่พร้อมกับเซสชัน SSH ที่ใช้งานไม่ได้ในระหว่างนั้น เมื่อคุณบังคับให้ทำเช่นsshdนี้ด้วยreptyr -s <pid>คีย์บอร์ดของคุณจะเข้าสู่กระบวนการนั้นไม่ใช่กระบวนการลูกที่ทำงานอยู่ ดังนั้น "Ctrl + Z" ก็จะฆ่าsshdมัน


1

ผมทำdo-dist-upgradeผ่าน SSH Broken pipeจากแล็ปท็อปที่เดินเข้าไประงับเหตุนี้ เมื่อกลับไปที่เครื่องฉันเห็นกระบวนการที่เกี่ยวข้องกับการอัปเกรดยังคงทำงานอยู่ซึ่งwhiptailฉันขอให้ป้อนข้อมูล (ตัวจัดการหน้าจอที่จะเลือก) และเกี่ยวข้องกับเจ้าของSCREENรูท ฉันสามารถที่จะทำsudo su -และscreen -rแนบกับเซสชั่นและแท้จริงและดูเถิดฉันมีกล่องโต้ตอบแส้หางอยู่ข้างหน้าฉันสามารถที่จะป้อน ฉันสามารถอัพเกรดต่อได้อย่างราบรื่น

หมายเหตุ: นี่เป็นการอัปเกรดจาก Ubuntu 14.04 เป็น 16.04

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