반응형

http://unix.co.kr/HOWTO/PPP/PPP-HOWTO.html#toc15

15.2 ppp-on 스크립트

이것이 실제로 연결을 시작하는 스크립트 짝 중 앞의 것이다.


#!/bin/sh
#
# PPP 연결을 초기화하는 스크립트다. 이것은 스크립트 쌍의 첫
# 부분이다. 이것은 'ps' 명령으로 볼 수 있으므로 안전한 스크립트 쌍은
# 아니다. 하지만 간단하다.
#
# 이것이 변수이다. 필요하면 고친다.
TELEPHONE=555-1212      # 연결용 전화번호
ACCOUNT=george          # 로긴을 위한 계정 이름('George Burns'같이)
PASSWORD=gracie
# 계정에 대한 비밀 번호(그리고 'Gracie Allen')LOCAL_IP=0.0.0.0
# 알고 있다면 로컬 IP 주소. 동적 = 0.0.0.0REMOTE_IP=0.0.0.0
# 원한다면 상대편 IP 주소. 보통 0.0.0.0NETMASK=255.255.255.0
# 필요한 경우 정확한 netmask
#
# 'ppp-on-dialer'에 쓸 수 있도록 이 정보를 보냄
export TELEPHONE ACCOUNT PASSWORD
#
# 전화를 걸고 로긴하는 스크립트의 위치를 정한다. $PATH 변수가 연결
# 선택사항에서는 먹지 않으므로 파일 이름의 절대 경로를 써야
# 한다. ('루트'계정에서 그렇게 하는 것은 보안구멍이 되므로 요청하지
# 않는다)
#
DIALER_SCRIPT=/etc/ppp/ppp-on-dialer
#
# 연결의 초기화
#
exec /usr/sbin/pppd debug /dev/ttySx 38400 \
        $LOCAL_IP:$REMOTE_IP \
        connect $DIALER_SCRIPT

이것이 ppp-on-dialer 스크립트다.:-


#!/bin/sh
#
# 이것이 ppp-on 스크립트의 두번째 부분이다. 이것은 원하는 연결을 위해
# 연결 프로토콜을 보여준다.
#
/usr/sbin/chat -v                                                 \
        TIMEOUT         3                               \
        ABORT           '\nBUSY\r'                      \
        ABORT           '\nNO ANSWER\r'                 \
        ABORT           '\nRINGING\r\n\r\nRINGING\r'    \
        ''              \rAT                            \
        'OK-+++\c-OK'   ATH0                            \
        TIMEOUT         30                              \
        OK              ATDT$TELEPHONE                  \
        CONNECT         ''                              \
        ogin:--ogin:    $ACCOUNT                        \
        assword:        $PASSWORD

PPP-2.2에서 ppp-off스크립트는 아래와 같다:-For PPP-2.2, the ppp-off script looks like:-


#!/bin/sh
######################################################################
#
# 끊을 장치를 정한다.
#
if [ "$1" = "" ]; then
        DEVICE=ppp0
else
        DEVICE=$1
fi

######################################################################
#
# ppp0 pid 파일이 있고 프로그램이 실행중이면 그것을 중지시킨다.
if [ -r /var/run/$DEVICE.pid ]; then
        kill -INT `cat /var/run/$DEVICE.pid`
#
# kill이 작동하지 않으면 이 pid에 대해 진행 중인 과정이 없는 것이다.
# 아마 잠금 파일이 아직 남아 있음을 뜻할 것이다. 동시에 이 잠금 파일도
# 지워야 할 것이다.
        if [ ! "$?" = "0" ]; then
                rm -f /var/run/$DEVICE.pid
                echo "ERROR: Removed stale pid file"
                exit 1
        fi
#
# 성공. pppd가 필요없는 흔적을 깨끗이 지우도록 한다.
        echo "PPP link to $DEVICE terminated."
        exit 0
fi
#
# ppp 과정이 ppp0에 대해 실행되지 않는다.
echo "ERROR: PPP link is not active on $DEVICE"
exit 1

15.3 제공된 PPP 시작 스크립트의 편집

두 부분으로 새 스크립트를 받았으면 순서대로 편집하자.

ppp-on 스크립트

이 스크립트를 인터넷 서비스 업체가 준 사용자 이름과 비밀번호, 전화번호를 감안해 편집한다.

TELEPHONE=같은 각 행은 '=' 오른쪽의 정보(물론 딸린 설명까지 포함해서)를 포함하는 쉘 변수를 실제로 설정한다. 따라서 이 행을 편집해서 인터넷 서비스 업체와 연결에 대해 정확하게 만들어야 한다.

마찬가지로, /etc/ppp/options파일에 있는 IP 주소를 (필요할 경우) 설정할 때는 아래와 같은 행을 삭제한다.


$LOCAL_IP:$REMOTE_IP \

또한, 쉘 변수 DIALER_SCRIPT가 완전한 위치와 실제로 쓰고자 하는 전화걸기 스크립트 이름을 가리키고 있는지 확인해야 한다. 따라서 이를 옮겼거나 스크립트 이름을 고칠 작정이라면, ppp-on 스크립트에서 이 행을 정확히 편집했는지도 확인해야 한다!

ppp-on-dialer 스크립트

이것이 ppp 연결을 실제로 만드는 스크립트의 뒷 부분이다.

주의: chat 스크립트는 원래 모두 한 줄에 쓰게 되어있으며역슬래쉬는 행이 바뀌었을 때도 한 줄로 인식할 수 있게 해주는 문자이다(사람이 읽을 수 있도록). 따라서 스크립트 자체의 일부는 아니다.

하지만, 어떤 일이 실제로 진행되는지(추측해서) 이해할 수 있도록 세부 사항을 보는 데는 대단히 쓸만하다.

15.4 Chat 스크립트가 뜻하는 것...

chat 스크립트는 "예상_문자열" "전송_문자열" 쌍의 연속이다. 특별히 내 쪽에서 뭔가 보내기 전에 항상 받을 것을 무언가 기다린다는 점에 주의하자.

아무것도 먼저 받지 않고서 뭔가를 보내려고 한다면 예상_문자열에 빈 문자열을 써야만 하고(""로 쓴다). 아무것도 보내지 않고 뭔가를 받으려 할 때도 비슷하다. 또한, 문자열이 몇개의 낱말로 구성되어 있다면(예를 들어 NO CARRIER), 반드시 chat가 하나의 항목으로 받아들이도록 이 문자열을 다 따와야 한다.

예제에서 chat 행은:-


exec /usr/sbin/chat -v

chat를 부른다. -v는 chat보고 모든 입출력을 시스템 log(보통 /var/log/messages파일)에 복사하도록 시킨다. 일단 기분좋게 chat 스크립트가 믿음직하게 동작했으면 이 행을 편집해서 syslog를 어지럽히는 -v를 지운다.


TIMEOUT         3

이는 예상하는 문자열의 입력을 삼초동안 기다리는 것이다. 모뎀이 진짜 느린 거라면 5초나 10초로 늘려줄 필요가 있다.


ABORT           '\nBUSY\r'

BUSY라는 문자열을 받게 되면 동작을 중지한다.


ABORT           '\nNO ANSWER\r'

NO ANSWER 라는 문자열을 받으면 동작을 중지한다.


ABORT           '\nRINGING\r\n\r\nRINGING\r'

RINGING이라는 문자열이 (반복적으로) 수신되면, 동작을 중지한다. 이 경우 누군가 당신에게 전화를 거는 중이기 때문이다.


"              \rAT

모뎀에서 아무것도 기다리지 않고 AT 문자열을 보낸다.


OK-+++\c-OK   ATH0

이건 좀 복잡한데 chat의 오류 복구 능력 중 일부를 쓰기 때문이다.

뭐라는 뜻이냐 하면... OK를 기다렸다가, 받지 못하면 (모뎀이 명령행상태가 아니라서) +++(표준 헤이스 호환 모뎀에서 명령행 상태로 돌아가는 문자열이다)를 보내고 나서 OK를 기다린다. 그런 다음 ATH0(모뎀 끊기 문자열)을 보낸다. 모뎀이 회선 상에서 먹통이 되어 있는 상황에서 스크립트가 처리할 수 있도록 해준다!


TIMEOUT         30

스크립트의 나머지 부분에 대해 30초의 시간 제한을 설정한다. chat 스크립트가 시간 제한 때문에 취소되는 문제를 겪는다면 45초나 그 이상으로 늘리면 된다.


OK              ATDT$TELEPHONE

OK를 기다렸다가 (모뎀이 ATH0 명령에 대답한 것이다) 원하는 전화번호로 전화한다.


CONNECT         ''

CONNECT를 기다리고 (이것은 상대방 모뎀이 대답할 때 내쪽 모뎀이 보낸다) 아무것도 보내지 않는다.


ogin:--ogin:    $ACCOUNT

다시 몇가지 오류 복구용이 여기 있다. login 프롬프트를 기다리고(...ogin:) 시간이 지나도 받지 못하면, 실행키를 보낸 다음 다시 login 프롬프트를 찾기 시작한다. 프롬프트를 받으면 사용자 이름(쉘 변수 $ACCOUNT에 저장되어 있다)을 보낸다.


assword:        $PASSWORD

비밀번호 프롬프트를 기다리고 내 비밀번호를 보낸다 (역시 쉘 변수에 저장되어 있다).

이 chat 스크립트는 적당한 오류 복구 능력을 갖고 있다. chat는 여기에 보인 것보다 더 많은 기능을 갖고 있다. 더 많은 정보를 원한다면 chat man 페이지를 본다.(man 8 chat)

PPP를 서버에서 시작하기

로긴한 다음 서버에서 자동적으로 pppd를 시작하는 경우에 ppp-on-dialer는 잘 작동하지만 몇몇 서버는 서버에서 PPP를 명확히 시작하도록 요구한다.

서버에서 PPP를 시작하기 위해 어떤 명령을 주어야 한다면, ppp-on-dialer 스크립트를 편집해야 한다.

스크립트의 맨 끝에(비밀번호 행의 뒤에) 추가적으로 expect send쌍을 넣어야 한다. 이것은 로긴 프롬프트를 검색할 것이다(본쉘에서 특별한 의미를 갖는 문자-예를 들어 $ 과 [ or ] (각 인용부호의 여닫이 기호)같은것도 주의한다.

chat가 쉘 프롬프트를 찾으면, chat는 인터넷 서비스 업체 쪽 PPP 서버에서 요구하는 ppp 시작 명령을 내야 한다.

내 경우, PPP 서버는 표준 리눅스 배쉬(bash) 프롬프트를 쓴다.


[hartr@kepler hartr]$

그리고 서버에서 PPP를 시작하도록 입력할 것을 요구한다.


ppp

몇가지 오류 복구를 할 수 있도록 하는 것이 좋을 것 같다, 내 경우는 아래와 같이 쓴다.


        hartr--hartr    ppp

이것은 시간 내에 프롬프트를 받지 못하면, 실행키를 보내고 프롬프트를 다시 찾는 것이다.

프롬프트를 받게 되면 ppp행을 보낸다.

주의: 앞 행의 맨 뒤에 \하나를 집어 넣어 chat가 chat 스크립트 전체를 한 행으로 생각하도록 하는 것을 잊어 먹으면 안된다!

운나쁘게, 몇몇 서버는 다양한 변종의 프롬프트를 준다! 미니콤을 써서 수회 로긴해 어떻게 나오는지 알아내고 안정적인 "예상" 문자열을 골라야 한다.

15.5 PAP/CHAP 인증 연결용 chat 스크립트

인터넷 서비스 업체가 PAP/CHAP를 쓸 경우, chat 스크립트는 더 간단하다. chat 스크립트에서 해야할 것은 전화해서, 연결을 기다린 다음 pppd가 로긴을 다루도록 하는 것 뿐이다!


#!/bin/sh
#
# 이것은 ppp-on 스크립트의 두번째 부분이다. 원하는 연결을 위해 연결
# 프로토콜을 보여준다.
#
exec /usr/sbin/chat -v                                  \
        TIMEOUT         3                               \
        ABORT           '\nBUSY\r'                      \
        ABORT           '\nNO ANSWER\r'                 \
        ABORT           '\nRINGING\r\n\r\nRINGING\r'    \
        ''              \rAT                            \
        'OK-+++\c-OK'   ATH0                            \
        TIMEOUT         30                              \
        OK              ATDT$TELEPHONE                  \
        CONNECT         ''                              \

15.6 pppd 오류 추적과 option_file 파일 선택사항

이미 앞에서 본 것처럼, pppd에서 -d를 선택해서 로긴하면 오류 추적 정보를 받을 수 있다. 이 '오류 추적' 선택사항은 아래 것과 동등하다.

새 스크립트를 가지고 새 연결을 구축하는 것이므로, 현재까지는 오류 추적 선택사항을 그냥 두자. (경고: 디스크 공간이 적을 경우, pppd 로긴을 바꾸는 것이 syslog 파일을 급격하게 키우고 문제가 생길 수도 있다 - 이것을 하면 연결에 실패할 것이고 몇분 정도 뒤에 다시 시도할 수 있다)

기분좋게 모든 것이 제대로 작동한다면, 이 선택사항을 없앨 수 있다.

/etc/ppp/options/etc/ppp/options.ttySx가 아닌 ppp 선택사항 파일을 불러냈다면, pppd의 file 선택사항에 파일 이름을 적어 주어야 한다 - 다음과 같은 식이다.


exec /usr/sbin/pppd debug file options.myserver /dev/ttyS0 38400 \

+ Recent posts