expect
: programmed dialogue with interactive programs
개요
Expect는 ' interactive '한 프로그램입니다. ' interactive ' 하다는 단어와 같이 Expect는 Shell 프로그램과 대화하듯 스크립트를 구성할 수 있는 프로그램입니다! Expect를 이용하면 여러 기능들을 굉장히 쉽게 만들 수 있습니다. 여러분들이 작성한 스크립트에 따라 프로그램에서 예상되는 내용에 맞는 답을 작성할 수 있습니다. 여러분들은 프로그램 실행 시 원하는 라인에서 제어권을 갖고 직접 상호 작용할 수도 있습니다. 옵션과 예시를 살펴보면서 좀 더 알아보겠습니다.
설치
만약, expect가 설치되어 있지 않다면 아래 명령어로 설치한다.
$sudo apt install expect
명령어
몇 가지 자주 사용되는 명령어들을 살펴보겠습니다. 간단하게 설명하고 있으니 자세한 내용은 man page를 참고해주세요.
send
문법 : send [-flag] string (ex : send "Hello world\r")
설명 : 문자열(string)을 현재 프로세스로 전달합니다. 예시에서 \r은 return character입니다.
send_user
문법 : send_user [-flag] string (ex : send_user "Hello world\n")
설명 : send와 유사한 기능이지만 문자열(string)을 현재 프로세스가 아닌 stdout으로 전달합니다.
sleep
문법 : sleep second
설명 : 입력된 second 동안 sleep됩니다.
spawn
문법 : spawn [args] program [args] (ex : spawn ls -al /tmp)
설명 : 입력된 program args로 새로운 프로세스를 생성합니다.
expect
문법 : expect [[-opts] pat1 body1] ... [-opts] patn [bodyn]
설명 : spawn 명령어로 생성한 프로세스의 출력과 패턴이 매칭될 때 까지 기다립니다. 즉, spawn된 프로세스에서 "ID :" 란 문자열이 화면에 표시될 때까지 기다리려면 expect -re "ID :" 와 같이 작성해서 기다리게 되는거죠.
Example
간단한 몇 개의 예제를 살펴보겠습니다.
1. Hello world
#!/bin/expect
send_user "Hello World\n"
test.exp 파일을 생성하고 내부에 위와 같이 작성해봅시다. 그 후 chmod+x test.exp로 실행 권한을 부여하고 ./test.exp를 실행하면 Hello World가 Terminal에 표시되는 것을 확인할 수 있습니다.
2. expect 와 send
#!/bin/expect expect "TRUE" { send_user "It is true!!" } |
위와 같은 구문은 프로세스로 부터 "TRUE"라는 문자열이 나타나기를 기다리게 되고, 만약 "TRUE"가 나타나가되면 "It is true"를 출력하게 됩니다.
linuxias@ubuntu:~/privateProject/tmp$ ./test.exp TRUE It is true |
3. timeout
#!/bin/expect set timeout 15 expect "TRUE" { send_user "It is true!!" } |
기본 timeout 설정 값은 10초 입니다. 여러분들이 원하는 시간으로 설정해 주기 위해 timeout 값을 설정해 줌으로써 기다리는 시간을 줄이거나 늘릴 수 있습니다.
4. 입력인자 받기
#!/usr/bin/expect set first [lindex $argv 0] set second [lindex $argv 1] send_user "$first" send_user "$second" |
expect 스크립트가 실행될 때 전달되는 파라미터를 출력하는 예제입니다. 예제만 보아도 해석하는데 큰 문제는 없을 거라 판단됩니다. 결과는 아래와 같습니다.
linuxias@ubuntu:~/privateProject/tmp$ ./test.exp A B A B |
5. ssh 연결하기
#!/usr/bin/expect set ip [lindex $argv 0] set user [lindex $argv 1] set pw [lindex $argv 2] spawn ssh "$id\@$ip" expect "Password:" send "$pw\r"; interact |
입력으로 ip, user id, password를 순서대로 입력받은 후 ssh로 입력된 ip에 입력된 id와 password로 자동으로 로그인까지 하는 예제 입니다. 이 때 interact command를 이용하여 다시 쉘의 제어권을 사용자에게 가져옴으로서 ssh 연결 후에도 스크립트의 종료 되어 끊기는 것이 아닌 연결된 상태로 사용할 수 있습니다.
6. Shell script에서 expect 실행하기
Shell script에서 expect를 수행하는 방법은 2가지가 있습니다. 아래 간단한 예시를 보시면 쉽게 이해가 가실 겁니다.
6-1.
#!/bin/sh IP=$1 USER=$2 PW=$3 expect <<EOF set timeout 15 spawn ssh -o StrictHostKeyChecking=no $USER@$IP expect "password:" send "$PW\r" expect eof EOF |
6-2.
#!/bin/sh IP=$1 USER=$2 PW=$3 expect -c " set timeout 15 spawn ssh -o StrictHostKeyChecking=no $USER@$IP expect "password:" send \"$PW\r\" expect eof " |
위 2 가지 방법으로 쉽게 Shell script에서 expect를 실행할 수 있는 예제입니다.
7. 함수 호출하기
#!/bin/expect proc func { a b } { send_user "Parameter $a $b" } func "Hello" "World" |
proc 예약어를 이용해서 함수를 선언하고 호출할 수 있습니다. 위 예제를 실행하면, Hello world가 실행되겠네요!
지금까지 expect에 대해 간단하게 알아보았습니다. 추가적인 내용은 필요할 때 점점 이 글에 추가해 나갈 예정입니다. 미약하지만 많은 분들에게 도움이 되었으면 좋겠습니다.
감사합니다. :-)
'Linux > Shell Script' 카테고리의 다른 글
[script] portscan (0) | 2018.03.09 |
---|---|
[참고용] test 명령어 표현식 (0) | 2015.04.25 |