18.01.1999, © Igor Sysoev, igor@nitek.ru

 

Удобный параметр call

 

Естественно, круг тех, кому можно позвонить, не ограничивается одними лишь провайдерами. Я, например, иногда использую pppd для связи с удаленными офисами. Например, для связи с офисом в Химках я использую примерно такую команду:

pppd cuaa1 57600 lock                                   \
        connect '/usr/bin/chat -V                       \
                ABORT           "ERROR"                 \
                ABORT           "NO DIALTONE"           \
                TIMEOUT         5                       \
                ""              "AT"                    \
                "OK"-"+++"-""   "AT"                    \
                "OK"            "ATZ"                   \
                "OK"            "ATS7=120"              \
                ABORT           "BUSY"                  \
                ABORT           "NO CARRIER"            \
                ABORT           "NO ANSWER"             \
                "OK"            "ATDP5556789"           \
                TIMEOUT         125                     \
                "CONNECT"       "\\c"                   \
                TIMEOUT         30                      \
                "ogin:"         "\\c"                   \
        '                                               \
        user ppnitek remotename khimki                  \
        ipcp-accept-local ipcp-accept-remote            \
        debug

Здесь мы видим два новых параметра ipcp-accept-local и ipcp-accept-remote. Дело в том, что я звоню через порт cuaa1, а для этого порта в /etc/ppp/options.cuaa1 для входящих звонков записаны адреса 192.168.1.1:192.168.1.200 и они не совпадают с теми, которые нам выдаст удаленная сторона в Химках, предположим, что они будут 192.168.10.200:192.168.10.1. Поэтому наша сторона будет считать, что данному соединению присвоены адреса 192.168.1.1:192.168.1.200, а удаленная - 192.168.10.200:192.168.10.1. В результате, хотя соединение состоится, мы не сможем ничего передать. Параметры ipcp-accept-local и ipcp-accept-remote заставляют pppd принять адреса, которые предлагает удаленная сторона.

В Химках стоит mgetty и аутентифкация выполняется через PAP. Поскольку телефонный номер один, то нам не понадобится наш скрипт и весь диалог chat мы разместили в параметрах pppd. Конечно, можно вспотеть, каждый раз набирая эту строку, поэтому ее можно записать в какой-нибудь файл и вызывать его как шелл-скрипт, но pppd предлагает другой, более удобный способ. Для этого в каталоге /etc/ppp/peers/ создадим файл khimki и запишем в него следующее:

cuaa1 57600 lock
connect '/usr/bin/chat -V                               \
                ABORT           "ERROR"                 \
                ABORT           "NO DIALTONE"           \
                TIMEOUT         5                       \
                ""              "AT"                    \
                "OK"-"+++"-""   "AT"                    \
                "OK"            "ATZ"                   \
                "OK"            "ATS7=120"              \
                ABORT           "BUSY"                  \
                ABORT           "NO CARRIER"            \
                ABORT           "NO ANSWER"             \
                "OK"            "ATDP5556789"           \
                TIMEOUT         125                     \
                "CONNECT"       "\\c"                   \
                TIMEOUT         30                      \
                "ogin:"         "\\c"                   \
        '
user ppnitek
ipcp-accept-local ipcp-accept-remote
debug

По сути, мы записали туда все наши параметры pppd. Заметьте, что при этом мы убрали "\" из всех строк, кроме chat скрипта. Теперь мы можем звонить в Химки вот такой простой командой:

pppd call khimki

Параметр call указывает pppd прочитать параметры из заданного файла в каталоге /etc/ppp/peers, в данном случае, это файл khimki. У этого способа есть еще одно существенное преимущество перед обычным шелл-скриптом. Дело в том, что существуют несколько параметров pppd, менять которые из командной строки может только root. Например, если в /etc/ppp/options.cuaa1 есть параметр auth, то указать параметр noauth в командной строке может только root. Но как же быть, если обычному пользователю нужно установить соединение с хостом, который не хочет себя аутентифицировать ? Для этого нужно создать файл в каталоге /etc/ppp/peers с нужными нам параметрами, в том числе noauth, и вызывать pppd с параметром call.

Естественно, вместе с параметром call можно добавить еще параметры. Допустим, мне нужно, что бы pppd автоматически пытался восстановить соединение в случае его обрыва, подождав одну секунду. Для этого я добавлю параметры persist и holdoff 1:

pppd call khimki persist holdoff 1

Кроме параметра call, есть еще параметр file. Он используется просто для группирования нужных параметров. Файл, указаный в этом параметре, может находится, где угодно.