2008-12-01 36 views
17

Trong tập lệnh bash, tôi thực thi lệnh trên máy từ xa thông qua ssh. Nếu người dùng phá vỡ tập lệnh bằng cách nhấn Ctrl + C, nó chỉ dừng tập lệnh - thậm chí không phải ssh client. Hơn nữa, ngay cả khi tôi giết ssh client lệnh từ xa vẫn đang chạy ...Làm thế nào để làm cho ssh để giết quá trình từ xa khi tôi ngắt ssh chính nó?

Làm thế nào có thể tạo bash để diệt trình khách ssh cục bộ và yêu cầu lệnh từ xa trên Crtl + c?

Một kịch bản đơn giản:

#/bin/bash 
ssh -n -x [email protected] 'mysqldump db' -r file.sql 

Trả lời

17

cuối cùng tôi tìm thấy một giải pháp như thế:

#/bin/bash 
ssh -t -x [email protected] 'mysqldump db' -r file.sql 

Vì vậy, - tôi sử dụng '-t' thay vì '-n'. Xóa '-n' hoặc sử dụng người dùng khác với root không giúp được gì.

+5

Tôi cần -t -t (hai lần) để làm cho nó hoạt động. – gravitation

1
trap "some_command" SIGINT 

sẽ thực hiện some_command tại địa phương khi bạn nhấn tổ hợp phím Ctrl + C. help trap sẽ cho bạn biết về các tùy chọn khác của nó.

Về vấn đề ssh, tôi không biết nhiều về ssh. Có lẽ bạn có thể gọi nó là ssh -n -x [email protected] 'killall mysqldump' thay vì some_command để giết lệnh từ xa?

2

Bạn có biết những tùy chọn bạn đang chuyển đến ssh không? Tôi đoán là không. Tùy chọn -n chuyển hướng đầu vào từ/dev/null, do đó quá trình bạn đang chạy trên máy chủ từ xa có thể không nhìn thấy SIGINT từ Ctrl-C.

Bây giờ, chúng ta hãy nói về cách xấu một ý tưởng nó là cho phép đăng nhập root từ xa:

Đó là một ý tưởng thực sự, thực sự xấu. Có một cái nhìn tại HOWTO: set up ssh keys cho một số gợi ý làm thế nào để quản lý an toàn thực hiện quá trình từ xa qua ssh. Nếu bạn cần chạy một cái gì đó với các đặc quyền từ xa bạn có thể sẽ muốn có một giải pháp liên quan đến một khóa công khai ssh với lệnh nhúng và một kịch bản chạy dưới quyền lịch sự gốc của sudo.

2

Khi phiên ssh của bạn kết thúc, trình bao sẽ nhận được SIGHUP. (tín hiệu gác máy). Bạn cần phải chắc chắn rằng nó gửi rằng trên tất cả các quá trình bắt đầu từ nó. Đối với bash, hãy thử shopt -s huponexit; your_command. Điều đó có thể không hoạt động, bởi vì trang người đàn ông nói huponexit chỉ hoạt động cho các trình tương tác.

Tôi nhớ việc chạy với người dùng đang chạy công việc trên cụm của tôi và họ có sử dụng nohup hay không (để có được hành vi ngược lại của những gì bạn muốn) nhưng tôi không thể tìm thấy bất cứ điều gì trong trang bash man about cho dù các tiến trình con bỏ qua SIGHUP theo mặc định. Hy vọng rằng huponexit sẽ làm các trick. (Bạn có thể đặt shopt đó trong .bashrc của bạn, thay vì trên dòng lệnh, tôi nghĩ vậy.)

Vì vậy, khi kết nối đóng, đọc từ đầu cuối sẽ bị lỗi EOF hoặc lỗi, và điều đó khiến hầu hết các chương trình đều thoát.

Các vấn đề liên quan