Я знайшов рішення тут: http://www.g-loaded.eu/2006/11/24/auto-closing-ssh-tunnels/
Найкращий спосіб - тунелі, які автоматично закриваються
Як вже було сказано раніше, замість того, щоб використовувати комбінацію комутаторів -f -N, ми можемо просто використовувати -f поодинці, але також виконувати команду на віддаленій машині. Але яку команду слід виконати, оскільки нам потрібно лише ініціалізувати тунель?
Це коли сон може бути найкориснішою командою з усіх! У цій конкретній ситуації сон має дві переваги:
- вона нічого не робить, тому ніяких ресурсів не витрачається
- користувач може вказати, як довго він буде виконуватися
Як вони допомагають в автоматичному закритті тунелю ssh, пояснюється нижче.
Ми починаємо сеанс ssh у фоновому режимі, виконуючи команду сну протягом 10 секунд на віддаленій машині. Кількість секунд не має вирішального значення. Одночасно ми виконуємо vncviewer точно так само, як і раніше:
[me@local]$ ssh -f -L 25901:127.0.0.1:5901 me@remote.example.org sleep 10; \
vncviewer 127.0.0.1:25901:1
У цьому випадку клієнту ssh доручається відкинути сеанс ssh на задній план (-f), створити тунель (-L 25901: 127.0.0.1: 5901) та виконати команду сну на віддаленому сервері протягом 10 секунд (сон 10).
Відмінність цього методу від попереднього (-N перемикача), в основному, полягає в тому, що в цьому випадку головна мета клієнта ssh - це не створити тунель, а скоріше виконати команду сну протягом 10 секунд. Створення тунелю - це якась побічна дія, вторинна мета. Якщо vncviewer не використовувався, ssh-клієнт виходив би через 10 секунд, оскільки у нього більше не буде роботи, руйнуючи тунель одночасно.
Під час виконання команди сну, якщо інший процес, vncviewer в цьому випадку, починає використовувати цей тунель і тримає його зайнятим понад 10 секунд, тоді, навіть якщо ssh-клієнт закінчить віддалене завдання (виконання сну), він не може вихід, тому що інший процес займає тунель. Іншими словами, ssh-клієнт не може знищити тунель, оскільки він також повинен вбити vncviewer. Коли vncviewer перестає користуватися тунелем, ssh-клієнт теж виходить, оскільки він вже досяг своєї мети.
Таким чином, жодні процеси ssh не залишаються запущеними у фоновому режимі.
/tmp/session1
(хоча рекомендується називати його за допомогою % шаблонів - див. Опис ControlPath вman ssh_config
)