Продолжим...
Мне не очень нравятся текущие скрипты установки соединения - надо бы
их улучшить, полюс дать возможность обычным пользователям тоже их
запускать. Итак...
Текущий телефон, по которому дозваниваться, и логин используемый при
аутентификации будут теперь храниться в файлике /etc/ppp/account в
виде:
begin /etc/ppp/account TELEPHONE=351992
ACCOUNT=myuser
end /etc/ppp/account Поэтому в скриптах дозвона теперь он будт использоваться подругому:
begin /etc/ppp/ppp-on-dialer #!/bin/sh
# Для удобства разделено на 2 столбца: чего ждем и как реагировать.
# Т.е. если модем выдал ответ "LEFT", то послать в него строку "RIGHT"
# Для управления существуют зарезервированные слова: ABORT и TIMEOUT
# ABORT - указывается строка, после которой работа завершится
# TIMEOUT - сколько ждать и если ничего не произошло также завершить
# работу.
. /etc/ppp/account
exec /usr/sbin/chat \
ABORT "ERROR" \
ABORT "NO DIALTONE" \
TIMEOUT 5 \
"" "AT" \
"OK"-"+++"-"" "ATH0" \
"OK" "ATS7=45" \
"OK" "ATS19=2" \
"OK" "ATL1" \
"OK" "ATX4" \
ABORT "BUSY" \
ABORT "NO ANSWER" \
ABORT "NO CARRIER" \
"OK" "ATDT${TELEPHONE}" \
TIMEOUT 30 \
"CONNECT" ""
end /etc/ppp/ppp-on-dialer строчка ". /etc/ppp/account" и говорит, что скрипт должен использовать
переменные определенные в /etc/ppp/account. ( ". file" - читает и
запускает команды из файла file в текущем окружении шела)
Плюс добавились строчки начальной инициализации модема, подробнее об
них можно узнать из документации по модему. Теперь у меня модем
негромко дозванивается до Инета, если линия занята почти сразу же
улавливает это, раньше приходилось ждать некоторое время.
begin /etc/ppp/ppp-on #!/bin/sh
. /etc/ppp/account
# остальные параметры
# Локальный IP-адрес. Если динамический, то 0.0.0.0
LOCAL_IP=0.0.0.0
# Удаленный IP-адрес. Можно указать 0.0.0.0
REMOTE_IP=0.0.0.0
# Файл options
FILE_OPTIONS='/etc/ppp/options.dialup'
# Команда инициации соединения. Параметры передаваемые pppd, в
# принципе, можно указывать в options.
/usr/sbin/pppd /dev/modem 57600 $LOCAL_IP:$REMOTE_IP \
file $FILE_OPTIONS user ${ACCOUNT}
end /etc/ppp/ppp-on Добавился импорт переменных из /etc/ppp/account. Плюс файлик немного
укоротился - все лишнее теперь вынесено в /etc/ppp/options.dialup.
begin /etc/ppp/options lock
end /etc/ppp/options все взваленно теперь на /etc/ppp/options.dialup.
begin /etc/ppp/options.dialup # Указывает, что pppd должен использовать lock в стиле UUCP на
# последовательное устройство, чтобы исключить одновременный доступ к
# устройству
lock
# Использовать линии управления модемом. На Ultrix эта опция означает
# управление потоком данных, как опция crtscts. (Эта опция не полностью
# выполняется)
modem
# Использовать аппаратное управление потоком данных (напр., RTS/CTS),
# чтобы управлять потоком данных на последовательном порту
crtscts
# async карта символов -- 32-bit hex; каждый бит - символ, который надо
# представить в виде escape-последовательности, чтобы pppd мог его
# принять.
# 0x00000001 - это маска для '\x01', а 0x80000000 - маска для '\x1f'.
asyncmap 0
# Установить максимальное число передач LCP configure-request в <n> (по
# умолчанию 10). Некоторые PPP сервера долго стартуют. Вам может
# понадобиться увеличить эту величину, если вы получаете ошибки 'serial
# line looped back' и вы УВЕРЕНЫ, что корректно регистрируетесь и PPP
# должен запускаться на сервере.
lcp-max-configure 20
# Показывать пароль при журналировании содержимого PAP пакетов, при
# отмене можно использовать hide-password
hide-password
# Необходим для отладки ppp-драйвера ядра. Позволяет включить
# расширенное журналирование соединения. 0 -отключено, 1 - основные
# отладочные сообщения, 2 - выводить полученные пакеты, 4 - выводить
# отправленные пакеты. Возможно комбинирование.
kdebug 0
# Если у Вас на компьютере есть хотя бы один сетевой интерфейс с
# каким-либо IP-адресом, то при установлении соединения, pppd пытается
# использовать этот адрес в качестве качестве своего локального адреса.
# Это не всегда нужно, поэтому параметр noipdefault пресекает подобные
# попытки. Если же у Вас на компьютере нет сетевых интерфейсов, то Вы
# можете не использовать этот параметр.
noipdefault
# После установления соединения адрес провайдера будет использоваться в
# качестве маршрута по умолчанию (default route), то есть, говоря
# по-русски, на этот адрес будут отправлятся все пакеты, которые
# Ваш компьютер не знает, куда отправить.
defaultroute
# Установить сетевую маску интерфейса в
netmask 255.255.255.0
# Использовать указанную команду или программу для настройки линии.
# Скрипт для соединения с провайдером
connect /etc/ppp/ppp-on-dialer
# Это параметр указывает pppd вести подробный протокол соединения
# debug
end /etc/ppp/options.dialup И на последок создадим скрипт автоматического передозвона в случае
каких-либо ошибок при инициализации соединения (занята линия, глюки
провайдера при определении пароля и т.п.). Но если уже у установленного
соединения связь обрывается скрипт ничего не делает, все равно к тому
времени он уже завершиться. Если необходимо реализовать передозвон в
случае отсоединения, то нужно смотреть в сторону параметра persist при
запуске pppd.
begin /etc/ppp/ppp-dial #!/bin/bash
#
# Установка ppp-соединения с автоматическим дозвоном до провайдера
#
# Вызов программы: ppp-dial [TELEPHONE ACCOUNT | ACCOUNT]
# где TELEPHONE - номер дозвона до провайдера
# ACCOUNT - учетная запись под которой нужно регистрироваться
# у провайдера, список учетных записей с паролями в
# /etc/ppp/pap-secrets
# Меняем параметры дозвона: имя пользователя и телефон, если они заданы
FILE_ACCOUNT="/etc/ppp/account"
. $FILE_ACCOUNT
NEED_CHANGE=0
NEW_ACC=$ACCOUNT
NEW_PHN=$TELEPHONE
# Сохраняем аргументы в переменных
if [ $# -eq 1 ]; then
NEW_ACC=$1
fi
if [ $# -eq 2 ]; then
NEW_PHN=$1
NEW_ACC=$2
fi
# Если введенные данные отличаются от существующих в $FILE_ACCOUNT, то
# сохраним их в этот файл - теперь будем использовать их при
# инициализации соединения.
if [ $ACCOUNT != $NEW_ACC ]; then
ACCOUNT=$NEW_ACC
NEED_CHANGE=1
fi
if [ $TELEPHONE != $NEW_PHN ]; then
TELEPHONE=$NEW_PHN
NEED_CHANGE=1
fi
if [ $NEED_CHANGE -eq 1 ]; then
echo "TELEPHONE="$TELEPHONE > $FILE_ACCOUNT
echo "ACCOUNT="$ACCOUNT >> $FILE_ACCOUNT
fi
########################################################################
wd=1 # счетчик попыток
stopflag=1 # Признак окончания работы сценария
echo
echo "Устанавливаю ppp-соединение "
echo
#
#
repeattime=30 # Установка предельного количества попыток дозвона
# А не запущен ли pppd раньше.
# Этой проверкой мы блокируем повторную инициализацию канала...
foo=$(ps -A) # Посмотрим, какие процессы крутятся в системе
bar=$(echo $foo | grep pppd) # Есть ли родимый pppd?
if [ -n "$bar" ]; then # Есть, поэтому заканчиваем работу...
stopflag=0
echo
echo " pppd уже функционирует!"
echo
exit 0
fi
echo "Количество попыток дозвона к провайдеру: $repeattime"
while [ "$stopflag" -eq 1 ]; do # Основной цикл дозвона
echo "Попытка соединения: $wd"
/etc/ppp/ppp-on # Просто вызываем программу установки соединения
echo "-- набор номера и ожидание ответа"
sleep 2
fl_stop=1
while [ "$fl_stop" -eq 1 ]; do # Основной цикл дозвона
foo=$(ps -A | grep chat) # Посмотрим, какие процессы крутятся в системе
if [ -n "$foo" ]; then
fl_stop=1 #Процесс chat еще работает
else
fl_stop=0 #Процесс chat завершился
fi
done
echo "-- идентификация и инициализация"
fl_stop=1
fl_rez=1 #Результат дозвона - положительный
while [ "$fl_stop" -eq 1 ]; do # ждем результата дозвона
foo=$(/sbin/ifconfig | grep ppp0) #смотрим, не образовался ли канал
ppp0
if [ -n "$foo" ]; then
fl_stop=0 #Да, все в порядке
else
fl_stop=1 #Нет, еще не организовался
foo=$(ps -A | grep pppd) # Посмотрим, какие процессы крутятся
в системе
if [ -n "$foo" ]; then
fl_stop=1 #демон ppp еще сущесвует
else
fl_stop=0 #демон ppp закончил свою работу
fl_rez=0 #Результат дозвона - "попытка не удалась"
fi
fi
done
if [ "$fl_rez" -eq 1 ]; then #Установлено соединение
stopflag=1
echo "**********************************************"
echo "*** Соединение с провайдером установлено! ****"
echo "**********************************************"
exit 0
else # Не вышло...
let wd=$wd+1 # Корректируем счетчик попыток
echo "-- сбой"
if [ $wd -gt $repeattime ]; then #Если исчерпано количество попыток
stopflag=0
echo
echo "Установить соединение не удалось..."
echo
exit 1
fi
fi
done # Завершаем работу сценария
end /etc/ppp/ppp-dial таким образом, если теперь в командной строке задать
$ ppp-dial 511999 kes_user
то все последующие попытки соединения будут происходит по телефону
511999 и учетной записью kes_user. Т.е. следующие соединения можно
производить просто набрав
$ ppp-dial
Если нужно изменить только учетную запись, а телефон не менять, то
нужно набрать:
$ ppp-dial new_kes_user
Сделаем этот файл исполняемым
$ chmod 755 /etc/ppp/ppp-dial
Теперь создадим символьные ссылки на ppp-off и ppp-dial в каталоге
/usr/local/bin:
$ ln -s /etc/ppp/ppp-off /usr/local/bin/ppp-off
$ ln -s /etc/ppp/ppp-dial /usr/local/bin/ppp-dial
Навесим на демон pppd дополнительный атрибут suid, чтоб запускался с
правами root:
$ chmod s+u /usr/sbin/pppd
Также необходимо разрешить пользователям использовать /dev/ttyS1
(устройство, на которое ссылается /dev/modem), это можно сделать двумя
способами.
1-ый права для обычных пользователей на чтение/запись:
$ chmod o+u /dev/ttyS1
2-ой добавить нужных пользователей в группу uucp. Почему uucp?
$ ls -l /dev/ttyS1
crw-rw1 root uucp 4, 65 Окт 17 11:18 /dev/ttyS1
Добавлять пользователей в другие грeggs можно командой usermod:
$ /usr/sbin/usermod -G uucp koal
За одним, изменим права и группу-владельца на ppp-on, ppp-dial, ppp-off
$ chmod 750 /etc/ppp/ppp-on /etc/ppp/ppp-dial /etc/ppp/ppp-off
$ chown :uucp /etc/ppp/ppp-on /etc/ppp/ppp-dial /etc/ppp/ppp-off
Все. Теперь я из-под пользователя koal могу инициировать соединение к
Инету.
C уважением, Kolotov Alexandr (aka mr. Эбола)
отвечать: myscri***@e*****.ru
ICQ: 100349254
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.linux.kirovlug&email=
http://subscribe.ru/ mailto:ask@subscribe.ru