Проброс SSH-туннеля скриптом

Материал из Lblss.ru
Перейти к: навигация, поиск

Подключиться из дома к компу на работе - казалось бы, чего проще? Шлюз позволяет. Одна короткая строчка:

$ 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: Вместо трех параметров в вызове можно запихать все-три-в-один.

Персональные инструменты