Xử lý Ctrl-C trong phiên SSH


20

Khi tôi bắt đầu một phiên SSH thực thi lệnh chạy dài, điều gì xảy ra với xử lý Ctrl+ C(SIGINT)?

Tôi có thể thấy rằng phiên SSH đã bị đóng, nhưng tôi không chắc ai sẽ nhận được SIGINT trước: phải không ...

  1. Lệnh chạy dài từ xa? nghĩa là, (a) trình xử lý tín hiệu trong lệnh từ xa được gọi và dừng lệnh từ xa, (b) lớp vỏ sinh ra nó phát hiện ra rằng lệnh dừng và cũng dừng lại (c) sshd từ xa phát hiện ra vỏ đã dừng, để nó đóng kết nối

    hoặc là

  2. ssh cục bộ nhận tín hiệu và đóng kết nối.

Tôi nghĩ rằng (1) đang xảy ra, nhưng muốn chắc chắn.

Tôi cũng không chắc chắn về những gì xảy ra với việc xử lý SIGINTs trong trường hợp này. Ví dụ, nếu tôi ...

ssh remote 'while true ; do sleep 1 ; date ; done'

Ctrl+ C, sau đó kết nối từ xa bị hủy. Có cách nào để chạy lệnh từ xa dưới lớp vỏ sẽ tồn tại sau Ctrl+ Ckhông? Đó là, trong trường hợp này, dừng vòng lặp và cho phép tôi tiếp tục làm việc trên shell từ xa?


3
Một ssh không tương tác ( ssh remote commandtrái ngược với ssh remote) sẽ bị giết (về phía cục bộ) bởi SIGINT được tạo bằng cách gõ ctrl-C. Phía từ xa có thể sẽ (phụ thuộc vào HĐH) vẫn chạy cho đến khi nó cố đọc hoặc ghi vào ổ cắm đã đóng. Nếu bạn muốn tất cả các tổ hợp phím của bạn, bao gồm ctrl-C, được chuyển đến điều khiển từ xa, hãy sử dụng ssh remote.
Đánh dấu Plotnick

@MarkPlotnick: OK Mark - nếu bạn thêm câu trả lời của bạn dưới đây làm câu trả lời, tôi sẽ chấp nhận nó ... Trong các thử nghiệm của riêng tôi, tôi đã xác minh rằng điều khiển từ xa không nhận được bất kỳ tín hiệu nào.
ttsiodras

Câu trả lời:


23

sshcó thể được gọi theo một vài cách khác nhau, mỗi cách xử lý các tín hiệu khởi tạo hơi khác nhau như thế nào Ctrl-C.

  • ssh remotehostsẽ chạy một phiên tương tác trên remotehost. Về phía máy khách, sshsẽ cố gắng đặt tty được sử dụng bởi stdin thành chế độ "thô" và sshdtrên máy chủ từ xa sẽ phân bổ giả và chạy shell của bạn làm vỏ đăng nhập (ví dụ -bash).

    Đặt chế độ thô có nghĩa là các ký tự thường gửi tín hiệu (như Ctrl-CCtrl-\) thay vào đó chỉ được chèn vào luồng đầu vào. sshsẽ gửi các ký tự như vậy đến máy chủ từ xa, nơi chúng có thể sẽ gửi SIGINT hoặc SIGQUIT và, thông thường, giết bất kỳ lệnh nào và đưa bạn trở lại trình bao trên máy chủ từ xa. Kết nối ssh sẽ tồn tại, miễn là vỏ từ xa còn sống.

  • ssh -t remotehost command args ...sẽ chạy một phiên tương tác trên remotehost, giống như ở trên, ngoại trừ ở phía xa, your_shell -c "command args ..."sẽ được chạy. Như trên, nếu bạn gõ Ctrl-C, nó sẽ được gửi đến máy chủ từ xa, nơi lệnh có thể sẽ nhận SIGINT và thoát ngay lập tức, và sau đó shell từ xa sẽ thoát. Điều khiển từ xa sshdsẽ đóng kết nối và sshbáo cáoConnection to remotehost closed.

  • ssh remotehost command args ...sẽ chạy một phiên không tương tác trên remotehost. Về phía khách hàng, sshsẽ không đặt tty thành chế độ thô (tốt, ngoại trừ việc đọc bằng mật khẩu hoặc cụm mật khẩu). Nếu bạn nhập Ctrl-C, sshsẽ nhận được SIGINT và sẽ ngay lập tức bị chấm dứt, thậm chí không phát hành một Connection to remotehost closedtin nhắn.

    Các your_shell -c "command args ..."quy trình có thể sẽ vẫn chạy trên máy chủ từ xa . Họ sẽ tự thoát hoặc một quá trình sẽ cố gắng ghi dữ liệu vào ổ cắm ssh đã đóng, điều này sẽ khiến tín hiệu SIGPIPE (thường) gây tử vong được gửi đến nó.


1
Về mặt kỹ thuật, lệnh từ xa không ghi trực tiếp vào ổ cắm. Stdout của nó là một đường ống. Và sshd ở đầu kia đọc dữ liệu, mã hóa nó và gửi nó qua ổ cắm. Kết quả cuối cùng là như nhau mặc dù. Lệnh sẽ nhận được một sigpipe vì đường ống đó đã biến mất khi máy khách ngắt kết nối.
Stéphane Chazelas

@ StéphaneChazelas Cảm ơn, tôi sẽ chỉnh sửa câu trả lời để sửa nó.
Đánh dấu Plotnick
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.