Сегодня напишем простой скрипт на языке shell, который будет определять включен ли компьютер, находящийся в сети. Например, нужно, чтобы туннель на роутере поднимался только, когда клиентская машина включена и разрушался, при ее выключении.
Как пробрасывать сам туннель, посредством OpenSSH, я уже рассказывал в ранее опубликованной статье. Поэтому, остановимся на вопросе определения, включен ли компьютер.
У стандартной консольной команды ping, есть параметры количества посылаемых запросов и таймаут ответа. Создадим shell скрипт detectPC.sh, следующего содержания:
- #!/bin/bash
- host=‘192.168.12.1’
- ping $host -c 1 -W 1 > /dev/null
- if [ $? —eq 0 ]
- then
- echo ‘Host is up’
- else
- echo ‘Host is down’
- fi
Как несложно догадаться, в переменной host указывается ip адрес машины, которую нужно проверить на предмет включения. Будем исходить из того, что на ней не закрыт ping (icmp 0, 8), что, кстати, в противном случае является дурным тоном. Никогда не закрывайте данные типы icmp сообщений, по крайней мере полностью.
У команды ping есть интересующие нас ключи:
-c – количество отправляемых запросов,
-W – таймаут ожидания ответа.
Устанавливаем один пакет и время ожидания одну секунду. Дальше самое интересное, после выполнения можно определить статус только что выполненной команды, через специальную переменную – “$?”. Обычно в Linux, если все прошло без ошибок, возвращается цифра 0. Иначе — ненулевое значение.
Едем дальше, теперь мы определили, включен ли PC, как пробросить туннель? Создадим другой скрипт, для обработки команд, toggleVPN.sh:
- #!/bin/bash
- controlFile=‘/var/run/ssh-myvpn-tunnel-control’
- remoteHost=‘111.222.33.44’
- function up()
- {
- if [ ! -S $controlFile ]
- then
- /usr/bin/ssh -S $controlFile -M -f -w 0:0 $remoteHost ifconfig tun0 10.10.10.1/30 pointopoint 10.10.10.2
- exit 0
- else
- echo ‘Tunnel already up!’
- exit 1
- fi
- }
- function down()
- {
- if [ -S $controlFile ]
- then
- /usr/bin/ssh -S $controlFile -O exit $remoteHost
- exit 0
- else
- echo ‘Tunnel already down!’
- exit 1
- fi
- }
- case $1 in
- ‘up’)
- up
- ;;
- ‘down’ )
- down
- ;;
- *)
- echo ‘Usage: up|down’
- ;;
- esac
- exit 1
Теперь наш detectPC.sh примет следующий вид:
- #!/bin/bash
- cd /22 #папка, где лежит скрипт toggletunnel.sh
- host=‘192.168.12.1’
- ping $host -c 1 -W 1 > /dev/null
- if [ $? —eq 0 ]
- then
- ./toggletunnel.sh up
- else
- ./toggletunnel.sh down
- fi
Обнаруживается недостаток: хардкод абсолютного пути. Запускать через cron будет неудобно. Чтобы повысить удобство использования, можно объединить эти два скрипта в один, следующим образом:
- #!/bin/bash
- controlFile=‘/var/run/ssh-myvpn-tunnel-control’
- remoteHost=‘111.222.33.44’ #OpenSSH сервер
- checkHost=‘192.168.12.1’ #Мониторим включена ли.
- function up()
- {
- if [ ! -S $controlFile ]
- then
- /usr/bin/ssh -S $controlFile -M -f -w 0:0 $remoteHost ifconfig tun0 10.10.10.1/30 pointopoint 10.10.10.2
- exit 0
- else
- echo ‘Tunnel already up!’
- exit 1
- fi
- }
- function down()
- {
- if [ -S $controlFile ]
- then
- /usr/bin/ssh -S $controlFile -O exit $remoteHost
- exit 0
- else
- echo ‘Tunnel already down!’
- exit 1
- fi
- }
- function auto()
- {
- ping $checkHost -c 1 -W 1 > /dev/null
- if [ $? —eq 0 ]
- then
- up
- else
- down
- fi
- }
- case $1 in
- ‘up’)
- up
- ;;
- ‘down’ )
- down
- ;;
- ‘auto’ )
- auto
- ;;
- *)
- echo ‘Usage: up|down|auto’
- ;;
- esac
- exit 1