Các phiên SSH bị treo khi tắt máy / khởi động lại


13

Tôi có một máy chủ chạy Debian và sshd trên đó, và trong trường hợp tôi cần khởi động lại máy chủ, phiên SSH của tôi bị treo ở phía máy khách cho đến khi hết thời gian TCP. Tôi cho rằng điều này là do khi sshdbị chấm dứt, nó không đóng các phiên SSH mở cho máy chủ. Tôi nên làm gì để sshdngắt kết nối mọi người trước, sau đó tự chấm dứt như bình thường? Cho đến nay tôi không thấy một tham số man sshd_confignào liên quan đến hành vi tắt máy.


Khi thất bại, bạn có thể giết máy khách SSH bất cứ lúc nào bằng cách nhấn [Enter] [~] [.]. Giải thích về cách thực sự giải quyết vấn đề của bạn sắp tới là tốt.
n.st

Câu trả lời:


32

Khi bạn tắt máy hoặc khởi động lại hệ thống, hãy systemdcố gắng dừng tất cả các dịch vụ nhanh nhất có thể. Điều đó liên quan đến việc hạ thấp mạng và chấm dứt tất cả các quy trình vẫn còn sống - thường theo thứ tự đó. Vì vậy, khi systemd giết chết các tiến trình SSH rẽ nhánh đang xử lý các phiên SSH của bạn, kết nối mạng đã bị vô hiệu hóa và chúng không có cách nào đóng kết nối máy khách một cách duyên dáng.

Suy nghĩ đầu tiên của bạn có thể là giết tất cả các quy trình SSH là bước đầu tiên trong quá trình tắt máy và có khá nhiều tệp dịch vụ systemd ngoài đó thực hiện điều đó.

Nhưng tất nhiên có một giải pháp gọn gàng hơn (cách thức "được cho là" phải được thực hiện) : systemd-logind.
systemd-logindtheo dõi các phiên người dùng đang hoạt động (cục bộ và SSH) và gán tất cả các quy trình được sinh ra trong chúng cho cái gọi là "lát". Theo cách đó, khi hệ thống ngừng hoạt động, systemd chỉ có thể SIGTERM mọi thứ bên trong các lát cắt của người dùng (bao gồm quá trình SSH rẽ nhánh đang xử lý một phiên cụ thể) và sau đó tiếp tục tắt các dịch vụ và mạng.

systemd-logindyêu cầu mô-đun PAM để được thông báo về các phiên người dùng mới và bạn sẽ cần dbussử dụng loginctlđể kiểm tra trạng thái của nó, vì vậy hãy cài đặt cả hai:

apt-get install libpam-systemd dbus

Hãy chắc chắn rằng bạn /etc/ssh/sshd_configthực sự sẽ sử dụng mô-đun với UsePAM yes.


Được rồi, mục tiêu đạt được, và cảm ơn cho lời giải thích. (Mặc dù tôi muốn có một số cách kiểm soát phụ thuộc để tắt máy, để mọi thứ đều là SIGTERM đầu tiên trong khi có thể hoàn thành công việc của mình, điều này có thể làm như một giải pháp xếp lớp.)
Vesper

Vì một số lý do, tôi đã không được thông báo về câu trả lời trong khi chỉ truy cập StackOverflow. Kỳ dị.
Vesper

1
Vì vậy, trong ngắn hạn, chỉ cần cạo vài giây khi tắt máy, chúng ta phải cài đặt toàn bộ tải tào lao chỉ để các kết nối của chúng tôi kết thúc đúng cách? Nghiêm túc ? Điều này đang trở nên tồi tệ. Chúng ta sẽ cam chịu.
leucos

3
Lưu ý rằng lần khởi động lại đầu tiên sau khi cài đặt libpam-systemd và dbus vẫn sẽ khiến phiên SSH của bạn bị treo. Để tránh điều đó, thay vì reboot, hãy thực hiện shutdown -rmặc định trễ 1 phút, để bạn có thời gian đóng phiên SSH.
mivk

9

Đây là thứ bạn cần đặt ở phía máy khách, không phải phía máy chủ. Chỉnh sửa của bạn ~/.ssh/configđể chứa

ServerAliveInterval 15
ServerAliveCountMax 5

Điều này có nghĩa là sau 15 giây không hoạt động, khách hàng của bạn sẽ gửi tin nhắn đến máy chủ. Nếu nó không nhận được bất kỳ phản hồi nào, nó sẽ thử lại tối đa 5 lần và khi nó vẫn không nhận được câu trả lời, nó sẽ đóng phiên.


2
Điều này sẽ dẫn đến độ trễ 75 giây trước khi máy khách ssh báo cáo máy chủ chết. Đúng?
Vesper

1
Có, và bạn có thể điều chỉnh các tham số để có thời gian chờ ngắn hơn.
Tero Kilkanen

Điều này giải quyết các vấn đề đối với tôi. Như một vấn đề khó chịu.
Justin Andrusk

5

Hành vi này được báo cáo trên Lỗi Debian này , bạn chỉ cần thiết lập chính xác các tập lệnh tắt máy được gửi cùng với gói bởi vì, tự động, chúng không được sao chép theo mặc định:

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service

1

Bạn có thể chỉ định các tùy chọn mà Jenny D đã nói trong câu trả lời của cô ấy chỉ bằng một lệnh ssh, chẳng hạn như

ssh -t -o ServerAliveInterval=1 -o ServerAliveCountMax=1 user@host sudo poweroff

nếu bạn làm điều đó thường xuyên, bạn có thể viết nó.


0

Làm việc cho tôi với lshd. Vì vậy, giải pháp sẽ là

apt install lsh-server
apt remove openssh-server

0

thật đáng buồn khi serverfault không cho phép tôi trả lời chủ đề do quá ít điểm kể từ nhiều năm. Nhưng tôi không cần spam trong các blog khác để mở khóa ^^ ... vì vậy, như câu trả lời dành riêng:

Như Rfraile đã đề cập

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service

làm. Để sử dụng nó mà không cần khởi động lại thể hiện / máy chủ, bạn nên thực hiện các tác vụ bổ sung:

systemctl daemon-reload
systemctl start ssh-session-cleanup.service

vì vậy dịch vụ đã được đăng ký và bắt đầu và systemd cần dừng dịch vụ này cho mục đích khởi động lại / tắt máy.


Vì vậy, bạn chỉ cần lặp lại một câu trả lời khác?
RalfFriedl

Không? Tôi chỉ sử dụng 2 dòng làm tham chiếu cho câu trả lời trên vì tôi chưa thể trả lời bằng văn bản. Tôi đã thêm các bước cần thiết để sử dụng nó mà không cần khởi động lại. Điều này cũng có thể được đưa ra trong một câu hỏi khác nhưng tôi chưa kiểm tra.
Reiner030
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.