Подключиться из дома к компу на работе - казалось бы, чего проще? Шлюз позволяет. Одна короткая строчка:
$ ssh -L 3022:internal.host:22 my.gateway.com
В принципе, так оно и есть. Ничего сложного. Однако, одного туннеля мало. Обычно надо три. А иногда и четыре. Да не вопрос, хоть десять! Чтобы не нагромождать открытые окна консоли, прячем сессии в screen:
$ /usr/bin/screen -dm /usr/bin/ssh -L 3022:internal.host:22 my.gateway.com
Даже на ярлык можно повесить эту строчку, чтобы открывать сессию по дабл-клику.
Однако, мой Internet-provider-name преподнес очередной сюрприз. Может заглючило у них чего, а может наняли нового админа с новою метлой, только повадился белый айпишник меняться раз по нескольку за час. До последнего времени неделями висел без изменений. Даже после дисконнекта. Если связь и лажала ненадолго - после сама же и восстанавливалась, благо, таймаут выставлен приличный и туннель никуда не пропадал. Теперь же, с пляской айпишников туннель сам не восстанавливается. Более того, если попробовать подключиться повторно, ничего не получится - сперва надо убить открытую и не успевшую помереть сессию. Искать PIDы только мертвых сессий лениво, потому с плеча:
$ killall ssh
Ну а локальные сессии (типа, на виртуалку, что под боком) ручками потом восстановить, ага. Как вариант, конечно. Точнее, как плохой вариант.
В итоге родился скрипт такого вида:
#!/bin/bash # Пробрасывалка SSH-туннелей на работу # Пример вызова: # ~/bin/ssh_tunnel.sh 3080 internal.webserver 80 localport=$1 remotehost=$2 remoteport=$3 pidfile="/var/run/user/${UID}/ssh${localport}.pid" cmd="/usr/bin/ssh -p 3022 -L ${localport}:${remotehost}:${remoteport} my.gateway.com" # Убиение старого if [ ! -z `/usr/bin/pgrep -f "^${cmd}"` ] then kill `/usr/bin/pgrep -f "^${cmd}"` /bin/rm -f $pidfile fi # Запуск нового /usr/bin/screen -dm ${cmd} # Новый PID пусть живет ещё и файле, авось, пригодится. pid=`/usr/bin/pgrep -f "^${cmd}"` echo $pid >$pidfile
Ну а вызов скрипта легко вешается на ярлык для дабл-кликабельности. :-)
PS: Слишком часто повторяется pgrep. Ну ничего, мне процессов не жалко.
PPS: Вместо трех параметров в вызове можно запихать все-три-в-один.