Tôi tìm thấy giải pháp ở đây: http://www.g-loaded.eu/2006/11/24/auto-closes-ssh-tunnels/
Cách tốt nhất - Đường hầm tự động đóng
Như đã đề cập trước đây, thay vì sử dụng kết hợp chuyển đổi -f -N, chúng ta chỉ có thể sử dụng -f một mình, nhưng cũng thực hiện một lệnh trên máy từ xa. Nhưng, lệnh nào sẽ được thực thi, vì chúng ta chỉ cần khởi tạo một đường hầm?
Đây là khi giấc ngủ có thể là mệnh lệnh hữu ích nhất trong tất cả! Trong tình huống đặc biệt này, giấc ngủ có hai lợi thế:
- nó không làm gì cả, vì vậy không có tài nguyên nào được tiêu thụ
- người dùng có thể chỉ định thời gian thực hiện
Làm thế nào những trợ giúp này trong việc tự động đóng đường hầm ssh được giải thích dưới đây.
Chúng tôi bắt đầu phiên ssh trong nền, trong khi thực hiện lệnh ngủ trong 10 giây trên máy từ xa. Số giây không quan trọng. Đồng thời, chúng tôi thực thi vncviewer chính xác như trước:
[me@local]$ ssh -f -L 25901:127.0.0.1:5901 me@remote.example.org sleep 10; \
vncviewer 127.0.0.1:25901:1
Trong trường hợp này, máy khách ssh được hướng dẫn rẽ nhánh ssh sang nền (-f), tạo đường hầm (-L 25901: 127.0.0.1: 5901) và thực hiện lệnh ngủ trên máy chủ từ xa trong 10 giây (ngủ 10).
Sự khác biệt giữa phương thức này và phương thức trước đó (-N switch), về cơ bản, là trong trường hợp này, mục tiêu chính của máy khách ssh không phải là tạo đường hầm, mà là thực thi lệnh ngủ trong 10 giây. Việc tạo ra đường hầm là một loại hiệu ứng phụ, một mục tiêu thứ yếu. Nếu vncviewer không được sử dụng, máy khách ssh sẽ thoát sau khoảng thời gian 10 giây, vì nó sẽ không có nhiều việc phải làm, phá hủy đường hầm cùng một lúc.
Trong quá trình thực thi lệnh ngủ, nếu một quá trình khác, vncviewer trong trường hợp này, bắt đầu sử dụng đường hầm đó và giữ nó vượt quá thời gian 10 giây, sau đó, ngay cả khi máy khách ssh hoàn thành công việc từ xa (thực thi giấc ngủ), nó không thể thoát vì một quá trình khác chiếm đường hầm. Nói cách khác, máy khách ssh không thể phá hủy đường hầm vì nó cũng sẽ phải giết vncviewer. Khi vncviewer ngừng sử dụng đường hầm, thì máy khách ssh cũng thoát, vì nó đã hoàn thành mục tiêu của nó.
Bằng cách này, không có quá trình ssh nào đang chạy trong nền.
/tmp/session1
(mặc dù nên đặt tên cho nó bằng cách sử dụng % mẫu - xem mô tả ControlPath trongman ssh_config
)