Автоматическое подключение к интернету в ubuntu.

Продолжим допиливать стандартный NM (network manager). Сегодня научим его автоматически подключаться к интернету, а также восстанавливать соединение при потере пинга.

Интересно, что галочка «подключаться автоматически» присутствует в NM, но она не работает при VPN соединении.


А вот пользователям Wi-Fi и DSL повезло. У них и автоматически подключается интернет и переподключается, в случае обрыва. Но управлять интернет соединением из консоли, это в любом случае полезно.

Примемся за создание скрипта, по автоматическому подключению к интернету.

Создаём файл с именем nmcli

sudo gedit /usr/local/bin/nmcli

В открывшийся файл, вставляем следующий код:

Показать »

#!/bin/bash

############
# SETTINGS #
############

get_connections_paths()
{
dbus-send —system —print-reply —dest=»$1″ «/org/freedesktop/NetworkManagerSettings» «org.freedesktop.NetworkManagerSettings.ListConnections»
| grep «object path» | cut -d ‘»‘ -f2
}

get_connection_settings()
{
dbus-send —system —print-reply —dest=»$1″ «$2» org.freedesktop.NetworkManagerSettings.Connection.GetSettings
}

get_connection_string_setting()
{
echo «$1» | grep -A 1 «»$2″» | grep variant | cut -d ‘»‘ -f2
}

get_connection_id()
{
get_connection_string_setting «$1» «id»
}

get_connection_type()
{
get_connection_string_setting «$1» «type»
}

get_device_type_by_connection_type()
{
echo «$1» | grep -q «ethernet» && echo 1 && return
echo «$1» | grep -q «wireless» && echo 2 && return
echo 0
}

find_connection_path()
{
for connection_path in `get_connections_paths «$1″`
do
connection_settings=`get_connection_settings «$1» «$connection_path»`
connection_settings_id=`get_connection_id «$connection_settings»`
[ «$connection_settings_id» = «$2» ] && echo «$1» «$connection_path»
done
}

find_connection_path_everywhere()
{
find_connection_path «org.freedesktop.NetworkManagerSystemSettings» «$1»
find_connection_path «org.freedesktop.NetworkManagerUserSettings» «$1»
}

print_connections_ids()
{
for connection_path in `get_connections_paths «$1″`
do
connection_settings=`get_connection_settings «$1» «$connection_path»`
connection_settings_id=`get_connection_id «$connection_settings»`
echo «$connection_settings_id»
done
}

print_connections_ids_everywhere()
{
print_connections_ids «org.freedesktop.NetworkManagerSystemSettings»
print_connections_ids «org.freedesktop.NetworkManagerUserSettings»
}

###########
# DEVICES #
###########

get_devices_paths()
{
dbus-send —system —print-reply —dest=»org.freedesktop.NetworkManager» «/org/freedesktop/NetworkManager» «org.freedesktop.NetworkManager.GetDevices»
| grep «object path» | cut -d ‘»‘ -f2
}

get_device_property()
{
dbus-send —system —print-reply —dest=»org.freedesktop.NetworkManager» «$1» «org.freedesktop.DBus.Properties.Get» string:»org.freedesktop.NetworkManager.Device» string:»$2″
| grep variant | awk ‘{print $3}’
}

get_device_type()
{
get_device_property «$1» «DeviceType»
}

get_device_path_by_device_type()
{
device_path_by_device_type=»/»
for device_path in `get_devices_paths`
do
device_type=`get_device_type «$device_path»`
[ «$device_type» = «$1″ ] && device_path_by_device_type=»$device_path»
done
echo «$device_path_by_device_type»
}

#######################
# ACTIVES CONNECTIONS #
#######################

get_actives_connections_paths()
{
dbus-send —system —print-reply —dest=»org.freedesktop.NetworkManager» «/org/freedesktop/NetworkManager» «org.freedesktop.DBus.Properties.Get» string:»org.freedesktop.NetworkManager» string:»ActiveConnections»
| grep «object path» | cut -d ‘»‘ -f2
}

get_last_active_connection_path()
{
get_actives_connections_paths | tail -n 1
}

get_parent_connection_path_by_device_type()
{
parent_connection_path=»/»
[ «$1» = 0 ] && parent_connection_path=`get_last_active_connection_path`
echo «$parent_connection_path»
}

get_active_connection_property()
{
dbus-send —system —print-reply —dest=»org.freedesktop.NetworkManager» «$1» «org.freedesktop.DBus.Properties.Get» string:»org.freedesktop.NetworkManager.Connection.Active» string:»$2″
| grep variant | awk -F ‘»‘ ‘{print $2}’
}

get_active_connection_service()
{
get_active_connection_property «$1» «ServiceName»
}

get_active_connection_path()
{
get_active_connection_property «$1» «Connection»
}

get_active_connection_path_by_connection_path()
{
for active_connection_path in `get_actives_connections_paths`
do
service=`get_active_connection_service $active_connection_path`
path=`get_active_connection_path $active_connection_path`
[ «$service» = «$1» ] && [ «$path» = «$2» ] && echo «$active_connection_path»
done
}

print_actives_connections_ids()
{
for active_connection_path in `get_actives_connections_paths`
do
service=`get_active_connection_service $active_connection_path`
path=`get_active_connection_path $active_connection_path`
connection_settings=`get_connection_settings «$service» «$path»`
connection_settings_id=`get_connection_id «$connection_settings»`
echo «$connection_settings_id»
done
}

##############
# START/STOP #
##############

start_connection()
{
my_connection_complete_path=`find_connection_path_everywhere «$1″`
my_connection_settings=`get_connection_settings $my_connection_complete_path`
my_connection_type=`get_connection_type «$my_connection_settings»`
my_connection_device_type=`get_device_type_by_connection_type «$my_connection_type»`

my_connection_service=`echo $my_connection_complete_path | awk ‘{print $1}’`
my_connection_path=`echo $my_connection_complete_path | awk ‘{print $2}’`
my_connection_device_path=`get_device_path_by_device_type «$my_connection_device_type»`
my_parent_connection_path=`get_parent_connection_path_by_device_type «$my_connection_device_type»`

echo «connection_service=$my_connection_service»
echo «connection_path=$my_connection_path»
echo «connection_device_path=$my_connection_device_path»
echo «parent_connection_path=$my_parent_connection_path»

dbus-send —system —print-reply —dest=»org.freedesktop.NetworkManager» /org/freedesktop/NetworkManager «org.freedesktop.NetworkManager.ActivateConnection» string:»$my_connection_service» objpath:»$my_connection_path» objpath:»$my_connection_device_path» objpath:»$my_parent_connection_path»
}

stop_connection()
{
my_connection_complete_path=`find_connection_path_everywhere «$1″`
my_active_connection_path=`get_active_connection_path_by_connection_path $my_connection_complete_path`

echo «active_connection_path=$my_active_connection_path»

dbus-send —system —print-reply —dest=»org.freedesktop.NetworkManager» /org/freedesktop/NetworkManager «org.freedesktop.NetworkManager.DeactivateConnection» objpath:»$my_active_connection_path»
}

########
# MAIN #
########

invalid_arguments()
{
echo «Usage: `basename «$0″` connexion_name start|stop»
echo «—Available Connections:»
print_connections_ids_everywhere
echo «—Active Connections:»
print_actives_connections_ids
exit 0
}

[ «$#» != 2 ] && invalid_arguments

case «$2» in
«start»)
start_connection «$1»
;;
«stop»)
stop_connection «$1»
;;
*)
invalid_arguments
;;
esac

Сохраняем и закрываем.
Или можно просто скачать файл командой

sudo wget http://dl.dropbox.com/u/24844052/tuksik/nmcli -O /usr/local/bin/nmcli

Позволяем файлу запускаться.

sudo chmod ugo+x /usr/local/bin/nmcli

Управление скриптом следующие:
Команда:

nmcli

Показывает все доступные соединения
Подключение и отключение выполняются командами start и stop соответственно.

nmcli имя_соеденения start|stop

Осталось только добавить подключение в автозагрузку:

Открываем «Автоматически запускаемые приложения»

gnome-session-properties

И добавляем новую запись. Т.к. vpn может подключиться, только при наличии локальной сети, то лучше поставить небольшую задержку. А значит в поле «команда» пишем:

sh -c "sleep 5 && nmcli имя_соеденения start"

Можете выйти из сеанса и зайти заново, что бы проверить работоспособность скрипта.

Перейдём к созданию скрипта для автоматического восстановления интернет соединения.

Создаём скрипт в любой папке, но обычно используют папку ~/bin. Если она у вас уже есть, то первую строчку можно пропустить.

mkdir ~/bin
gedit ~/bin/reconnect

Вставляем следующий код:

Показать »

#! /bin/bash
#
CONNECTION="имя_соеденения"
DEST="ya.ru"
while [ 1 ]
do
STTS=`ping -c 3 -s 1000 $DEST |grep received | awk -F, '{print $2}' |awk '{print $1}' `
if [[ $STTS == *3* ]] ||
[[ $STTS == *2* ]] ||
[[ $STTS == *3* ]] ; then
echo > /dev/null
else
nmcli $CONNECTION stop > /dev/null
sleep 3s
nmcli $CONNECTION start > /dev/null
echo "Пинг потерян. Переподключаюсь..." `date +'%Y.%m.%d %H:%M:%S'` >> ~/disconects
fi
sleep 10
done

Где ~/disconects файл с отчётами о потере пинга. И не забудьте изменить значение CONNECTION на имя вашего соединения. При желании можно изменить и значение DEST.
Если у вас ubuntu 11.10 и выше, то синтаксис nmcli немного другой:
для поднятия интерфейса nmcli con up id $CONNECTION
и для отключения соответственно nmcli con down id $CONNECTION
Спасибо за информацию Alexey.

Сохраняем, закрываем и делаем файл исполняемым:

chmod +x ~/bin/reconnect

Добавляем скрипт в «Автоматически запускаемые приложения».

gnome-session-properties

Добавляем новую задачу и в поле «команда» пишем:

sh -c "sleep 20 && /home/user/bin/./reconnect"

Т.к. соединение не может установиться мгновенно, то делаем задержку. Кроме того, в данном случае, «sh -c» нужно писать обязательно. И не забудьте поменять user на своё имя пользователя.

Поделись статьёй с друзьями

Или просто поиграйся с кнопочками

14 комментариев на «Автоматическое подключение к интернету в ubuntu.»

  1. sel:

    на DSL работает «из коробки» переподключение

    • Zegi:

      Видимо тока VPN глючит …
      Кстати, он переподключается при потере пинга или соеденения? А провайдеры разные бывают… вроде конект есть, а ничего не открывается, пока не переподключишся.
      P.S.: В любом случае скрипт может быть полезен не только для автоматического подключения. Например пришли вы к другу в гости, у него тот же провайдер, но с хреновым тарифом.
      Подключаемся удаленно к своему компьютеру:
      Через htop убиваем процесс с автоподключением, затем делаем команду:
      nmcli имя_соеденения stop && sleep 30m && /home/user/bin/./reconnect
      Компьютер отрубит интернет на 30 минут, а потом будет пытаться подключиться.
      Думаю ещё много можно найти пременений этим скриптам, нужно только проявить фантазию.

  2. sel:

    Потере пинга не знаю у меня не теряется, а при выбивании реконектит если 2 попытки неудачно то перестаёт.

  3. kraleksandr:

    Второй скрипт (реконнект) периодически пишет «[: 17: -eq: unexpected operator». Это что?

  4. Zegi:

    Слегка изменил скрипт переподключения.Сделал его более добрым к кратковременным потерям пакетов. И вроде больше нет ошибки «[: 17: -eq: unexpected operator» »
    Кстати, если есть желание, что бы скрипт запускался в терминале, то в автозагрузку можно добавить примерно такую команду:
    gnome-terminal -x bash -i -c "~/bin/./reconnect"

  5. Андрей:

    В случае с ADSL — у меня в Ubuntu 10.04-2 всё работает из коробки, ничего допиливать не надо . Автоматически подключает то соединение , что мне нужно… через Network Manager, а переключение между соединениями происходит в разы быстрее чем в
    Windows — реально в два клика.

  6. /usr/local/bin/nmcli: строка 8: ошибка синтаксиса около неожиданной лексемы `|’
    /usr/local/bin/nmcli: строка 8: `| grep «object path» | cut -d ‘»‘ -f2’

    Выдает такую ошибку при попытке выполнить nmcli
    Что делать?

  7. Alexey:

    Выложенный здесь nmcli не подходит для network-manage 0.9 (ubuntu 11.10) — там он уже встроенный, и у него немного другой синтаксис.
    для поднятия интерфейса nmcli con up id $CONNECTION
    и для отключения соответственно nmcli con down id $CONNECTION

  8. Alexey:

    Спасибо Вам за статью и за скрипт автоподключения.
    Раз обновили статью по синтаксису nmcli, то вверху, где предлагается скачать nmcli напишите про то что он есть в NM 0.9 (если я не ошибаюсь он там с версии 0.8.1). Я первый раз когда по пунктам шел перезаписал оригинальный nmcli представленным и долго пытался разобраться почему не работает. Спасибо.

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