Я нашел решение здесь: http://www.g-loaded.eu/2006/11/24/auto-closing-ssh-tunnels/
Лучший способ - Туннели, которые автоматически закрываются
Как уже упоминалось ранее, вместо использования ключа -f -N мы можем просто использовать -f отдельно, но также выполнить команду на удаленном компьютере. Но какую команду следует выполнить, поскольку нам нужно только инициализировать туннель?
Это когда сон может быть самой полезной командой из всех! В этой конкретной ситуации сон имеет два преимущества:
- ничего не делает, поэтому ресурсы не расходуются
- пользователь может указать, как долго он будет выполняться
Как они помогают в автоматическом закрытии туннеля ssh, объяснено ниже.
Мы запускаем сессию ssh в фоновом режиме, выполняя команду sleep в течение 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) и выполнить команду sleep на удаленном сервере в течение 10 секунд (sleep 10).
Разница между этим методом и предыдущим (ключ -N), по сути, заключается в том, что в этом случае основная цель клиента ssh - не создать туннель, а выполнить команду сна в течение 10 секунд. Создание туннеля является своего рода побочным эффектом, вторичной целью. Если vncviewer не используется, клиент ssh завершит работу через 10 секунд, поскольку у него не останется больше заданий, одновременно уничтожая туннель.
Во время выполнения команды sleep, если другой процесс, в данном случае vncviewer, начинает использовать этот туннель и сохраняет его занятым после 10-секундного периода, тогда, даже если клиент ssh завершает свою удаленную работу (выполнение сна), он не может выход, потому что другой процесс занимает туннель. Другими словами, клиент ssh не может уничтожить туннель, потому что он должен был бы также убить vncviewer. Когда vncviewer прекращает использовать туннель, ssh-клиент тоже завершает работу, поскольку он уже достиг своей цели.
Таким образом, ssh-процессы не работают в фоновом режиме.
/tmp/session1
(хотя рекомендуется называть его с использованием % шаблонов - см. Описание ControlPath вman ssh_config
)