Linux. Определить включен ли компьютер (через сеть).

Сегодня напишем простой скрипт на языке shell, который будет определять включен ли компьютер, находящийся в сети. Например, нужно, чтобы туннель на роутере поднимался только, когда клиентская машина включена и разрушался, при ее выключении.



Вот такая у нас будет схемка, в качестве VPN сервера может выступать маршрутизатор филиала фирмы. Или, может быть, вы захотите, чтобы туннель пробрасывался к вашему VPS серверу для доступа к закрытым извне инструментам администрирования, некоторым портам (PMA, MySQL)

Как пробрасывать сам туннель, посредством 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

Добавить комментарий