본문 바로가기
IT 기술/개발환경_유틸 관련 팁

[ubuntu] minicom 스크립트 실행하기

by 땅뚱 2013. 9. 25.

minicom 을 설치하면 /usr/bin/runscript 도 함께 설치된다. runscript 는 minicom 을 위한 스크립트 해석기라고 생각하면된다. runscript 는 시스템 로그인이나 원하는 작업을 자동화하기 위해서 minicom 내부에서 호출된다.

 

나의 개발환경에서 매번 부팅때마다, 동일한 명령을 손으로 치고 있으려니 여건 불편한 것이 아니었는데, minicom 의 runscript 기능 및 expect 기능을 사용하여 편리하게 사용하고 있다. 여기서는 runscript 에 대해서 간단하게 알아보고, expect 는 다음에 포스팅해보려고 한다.

 

우선 minicom 을 설치했다면 runscript 가 설치되어 있을 것이다.

 

minicom 관련 파일확인

# dpkg -L minicom

...

/usr/bin/minicom

/usr/bin/runscript

/usr/bin/ascii-xfr

/usr/bin/xminicom

...

 

runscript 에 인식하는 명령은 다음과 같다.

 

명령어  의미 
 send <string>  <string> 을 시리얼을 통해 보낸다. '\r' 이 포함되어 보내진다. 
 send hello 또는 따옴표를 사용하여 send "hello world" 와 같이 쓸 수 있다.
 goto <label>  스크립트내 특정 label 를 점프  
 gosub <label>  스크립트내 특정 label 로 점프, return 을 만나면 gosub 다음 문장으로 제어가 넘어온다. 
    gosub 명령으로부터 리턴한다. 
 label:  label 을 정의한다. 
 ! <command>  <command> 를 실행하기 위해서 쉘을 수행하고, 그 결과를 변수 $? 값에 세팅한다. 따라서 다음 if 문에서 $? 을 사용하여 command return 값을 테스트할 수 있다. 
 exit [value]   runscript 를 종료하면서 value 를 넘겨준다. 기본값은 1이다. 
 print <string>  로컬 스크린에 <string> 을 출력한다. 기본적으로 '\r\n' 이 추가된다.
 set <var> <value>  변수var 에 value 값을 넣는다. 만일 var 이 존재하지 않는 경우, 생성될 것이고, value 는 또 다른 변수도 가능하다.
 inc <var>  변수 var 1 증가 
 dec <var>  변수 var 1 감소 
 if <value> <operator> <value> <statement>  operator 는 <, >, !=, = 이 가능하고, 조건이 만족하면 <statement> 가 실행된다.
 예를 들면 if a > 3 goto exitlabel 과 같은 문장이 가능하다.
 timeout <value>  스크립트 전체 timeout 을 설정한다. 기본적으로 runscript 는 120초의 timeout 을 갖는다. expect 내부에서는 다른 값을 갖는다. 관련된 내용은 아래 expect 명령을 참조하면 된다.
 verbose <on|off>  on 인 경우 runscript 가 시리얼로부터 읽어오는 모든 것을 그대로 출력해준다. runscript 가 무엇을 하고 있는지 궁금한 경우 켠다. 
 sleep <value>  <value> 초 만큼 스크립트 수행을 지연시킨다. 
 expect  expect {
    pattern [statement]
    pattern [statement]
    [timeout <value> [statement]]

    ...
 }
 가장 중요한 명령어이다. expect 는 입력으로부터 읽은 내용을 유지하고 있다가, pattern 과 동일한 입력이 들어오면 statement 를 수행한다. statement 가 없는 경우 기본적으로 expect 문을 빠져나온다. 'pattern' 은 위 send 명령에서 설명한 string과 동일하다. expect 는 기본적으로 60초 timeout 을 갖는데, timeout 명령을 사용해서 수정할 수 있다.
 break  expect 명령에서 빠져나간다. 이것은 expect 문장내부에서 사용하는 timeout 의 statement 에 사용할 때 유용한데, 그 이유는 timeout 의 기본 동작이 script 를 빠져나가는 것이기 때문이다. expect 에서 timeout 이 발생했을 때, 다음 문장을 수행하고자 할 때는 break 를 사용하면 된다. 
 call <scriptname>  다른 스크립트 파일로 제어를 넘겨준다. 그 스크립트 파일이 에러없이 수행되면 다시 원래의 스크립트 파일로 제어가 넘어와서 계속 수행된다. 

 

다음은 자동으로 로그인하는 스크립트의 예제이다. 자신의 환경에 맞게 expect 문의 pattern 을 수정하면 된다.

(출처 : http://www.ru.j-npcs.org/usoft/WWW/HOWTO/mini/PPP-over-minicom)

 

print "" print "Automatic login via /etc/ppp/login.script" expect { "ogin:" "ogin>" "sername:" "sername>" "NO CARRIER" exit 1 } send "$(LOGIN)" expect { "assword:" "assword>" timeout 20 } send "$(PASS)"

expect {
       "port"  send "ppp"
       "Start your PPP now"
       "}!}!}"
       timeout 10
}
print ""
print "Now switching into ppp-mode ..."
print ""
! /usr/sbin/pppd file /etc/ppp/mini_options

print "" print "the command killall -TERM pppd terminates pppd"

 

스크립트를 실행하는 방법은 2가지가 있다. minicom 을 실행할 때, 파라미터로 주는 방법과 minicom 실행 후 스크립트 실행 메뉴에서 직접 실행시키는 방법이 있다.

 

minicom 파라미터로 실행시킬 경우 다음과 같이 실행한다. scriptfile 을 적어줄 경우 전체 경로까지 함께 적어준다.

 

# sudo minicom -S <scriptfile>

 

minicom 내부에서 실행할 경우에는 CTRL-A (기본값) + G 를 누른 후 스크립트 파일 경로를 적어주고, 엔터키를 누르면 해당 스크립트가 실행된다.