Làm thế nào tôi có thể kết nối lại với một phiên ssh sau khi một đường ống bị hỏng?


28

Vì vậy, tôi đang chạy apt-get upgradetrên một máy chủ khi bộ định tuyến quyết định nó đã quá lâu kể từ lần cuối khiến tôi tức giận: Nó bị mất tất cả kết nối. Đạo đức của câu chuyện là sử dụng screenrất nhiều khi bạn sử dụng bộ định tuyến bum.

Dù sao, tôi đã đăng nhập lại và nhận thấy rằng quá trình này vẫn đang bị treo ở đó, vẫn đang chờ Y / n của tôi nâng cấp (may mắn là vẫn chưa đạt được điều đó). Có cách nào tôi có thể gắn lại vào một phiên đã bị phá vỡ không? Cuối cùng tôi đã giết nó vì nó không ở giữa quản lý gói nhưng thật tuyệt khi biết để tham khảo trong tương lai.


1
Tôi ngạc nhiên apt-getquá trình vẫn đang chạy. Đáng lẽ nó đã chết cùng với toàn bộ chuỗi quy trình lên tới SSH. Tôi đã nhận thấy rằng do-dist-upgradetự động bắt đầu trong một screen/ byobuphiên: có thể trong một số trường hợp, apt-getcó giống như vậy không?
nfirvine

Câu trả lời:


16

Câu trả lời cho câu hỏi thích hợp của bạn là: bạn không thể . Tôi nghĩ vấn đề chính là các thủ tục xác thực sẽ không đồng bộ. Nó chỉ không hoạt động như vậy.

Như bạn đã nhận thấy, giải pháp là sử dụng màn hình khi có thể (nhân tiện, tmux là một giải pháp thay thế cho màn hình).


1
Nhưng nếu bạn có ssh không mật khẩu thì sao? Bạn có thể làm điều đó sau đó?
Sridhar Sarnobat

1
byobulà một giao diện đẹp, dễ sử dụng hơn screen(hoặc tmux) - chắc chắn đáng xem (:
drevicko

Sridhar-Samobol, xác thực vẫn cần phải diễn ra. Việc gắn vào một phiên chạy không có cách nào để thực hiện lại bắt tay ban đầu, do đó, bất biến sẽ bị phá vỡ nếu chúng tôi giới thiệu một phiên mới vào một phiên hiện có. Trả lời: không.
kevr

9

Để chạy các quy trình lâu dài, tôi sử dụng màn hình hoặc byobu nếu bạn muốn giao diện thân thiện hơn.

Đối với màn hình, bạn có thể sử dụng:

screen [program] [args]

Điều này sẽ chạy [chương trình] và [args] của nó trong một phiên màn hình . Khi chương trình kết thúc, phiên sẽ tự động đóng lại. Nếu bạn muốn giữ phiên sau khi chương trình của bạn chạy, chỉ cần chạy màn hình mà không có bất kỳ đối số nào và một dấu nhắc mới sẽ xuất hiện bên trong phiên. CTRL + A + D tách thiết bị đầu cuối khỏi phiên hiện tại.

Để đính kèm lại một phiên trước đó:

screen -r

Nếu chỉ có một phiên mở, nó sẽ gắn lại ngay lập tức. Nếu nhiều phiên đang diễn ra, nó sẽ hỏi bạn muốn đính kèm vào phiên nào. Nếu bạn biết tên phiên, bạn chỉ có thể thêm nó làm đối số cho dòng lệnh này.

Byobu là một cải tiến tốt đẹp. Nó dựa trên màn hình , nhưng cung cấp một thanh ở phía dưới hiển thị tất cả các phiên hiện tại dưới dạng các tab và cung cấp các phím tắt dễ dàng hơn để di chuyển xung quanh chúng. Bạn có thể:

  • F2 bắt đầu một phiên mới
  • F3 chuyển sang tab phiên tiếp theo bên trái
  • F4 chuyển sang tab phiên tiếp theo bên phải
  • F8 đặt tên thân thiện cho tab phiên hiện tại
  • F9 mở menu tùy chọn
  • CTRL + A + D tách tất cả các phiên từ thiết bị đầu cuối.

Lời khuyên : tránh để lại một phiên mở với root người dùng . Nếu bất cứ ai có quyền truy cập vào thiết bị đầu cuối của bạn (cục bộ hoặc từ xa), họ có thể dễ dàng gắn lại vào một phiên đang diễn ra và sử dụng hệ thống của bạn làm root. Nếu cần, tốt nhất là bắt đầu một phiên sử dụng một dòng lệnh người dùng thông thường và sudo khi cần thiết.


1
Tôi có thể trích dẫn OP: "Đạo đức của câu chuyện là sử dụng màn hình rất nhiều". Rõ ràng đó không phải là câu hỏi ở đây.
tháng 1

Cảm ơn đã viết nhưng tháng một là chính xác.

Sử dụng màn hình sudo <lệnh> để thiết lập màn hình là root, cần truy cập sudo để kết nối lại với màn hình đó. Tốt hơn nhiều so với việc bắt đầu một màn hình bình thường, sau đó thay đổi để root bên trong nó.
djsmiley2k - CoW

8

Mặc dù bạn không thể gắn lại vào phiên SSH bị hỏng, bạn có thể sửa chữa lại quá trình đang chạy bên trong SSH - tương đương về mặt chức năng với những gì bạn muốn.

Hướng dẫn

Trong trường hợp của bạn, bạn sẽ đảm nhận apt-getquá trình được kiểm soát từ phiên SSH mới , screenphiên hoặc tương tự. Yêu thích của tôi cho điều này là reptyrlệnh:

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

Sau đó, với pid bạn tìm thấy cho quá trình của bạn:

$ sudo reptyr -T 10626

Hoặc nếu điều đó không hiệu quả, hãy thử:

$ reptyr 10626

Sau giai đoạn này, tất cả đầu vào bàn phím của bạn sẽ chuyển sang chương trình bạn đã thực hiện. Thật không may, bạn sẽ không thấy đầu ra cũ của phiên SSH, chẳng hạn như apt-getđầu ra yêu cầu bạn xác nhận.

Giải thích

Có nhiều công cụ khác về cơ bản hoạt động giống như reptyr(nghĩa là, thông qua ptracetệp đính kèm gỡ lỗi). Xem các câu hỏi và câu trả lời sau đây khi chúng được thảo luận:

Trong các hướng dẫn ở trên, reptyr 10626sử dụng ptracetệp đính kèm gỡ lỗi trong khi sudo reptyr -T 10626lệnh sử dụng TTY ăn cắp và tốt hơn là ( chi tiết ).

Cuối cùng, lý do tại sao bạn không thể tiếp quản phiên SSH theo cách này là do sshdquá trình không được điều khiển bởi thiết bị đầu cuối máy chủ, thay vào đó, nó cung cấp phần phụ của thiết bị đầu cuối - một ptsthiết bị - trong khi phần chính điều khiển nó nằm trên máy khách, ở đây có phiên SSH bị hỏng ở giữa. Khi bạn buộc thực hiện sshdquy trình như vậy reptyr -s <pid>, đầu vào bàn phím của bạn sẽ chuyển sang quy trình đó, chứ không phải quy trình con đang hoạt động. Vì vậy, một "Ctrl + Z" sẽ đơn giản giết chết điều đó sshd.


1

Do đó, tôi đã thực hiện do-dist-upgradethông qua ssh từ một máy tính xách tay bị đình chỉ Broken pipe. Khi quay trở lại máy, tôi thấy các quy trình liên quan đến nâng cấp vẫn đang chạy, trong đó có whiptailyêu cầu tôi nhập liệu (trình quản lý hiển thị để chọn) và, một cách phù hợp, thuộc sở hữu gốc SCREEN. Tôi đã có thể làm sudo su -screen -rđể đính kèm vào phiên và, lo và kìa, tôi có hộp thoại whiptail trước mặt tôi có thể nhận đầu vào. Tôi đã có thể tiếp tục nâng cấp liên tục.

Lưu ý: đây là bản nâng cấp từ Ubuntu 14.04 lên 16.04.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.