맨위로가기

Expect

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

Expect는 텔넷, FTP, SSH 등과 같은 대화형 응용 프로그램의 제어를 자동화하는 데 사용되는 유틸리티이다. 의사 터미널을 사용하거나 콘솔을 에뮬레이션하여 대상 프로그램과 통신하며, 정규 표현식 패턴 매칭과 같은 기능을 통해 스크립트가 프로그램들을 제어할 수 있게 한다. Expect는 기존 유틸리티를 묶는 역할을 하며, 주로 상업용 소프트웨어 제품의 명령줄 인터페이스를 자동화하는 데 활용된다. autoexpect 도구를 사용하여 스크립트 생성을 자동화할 수 있으며, 텔넷, FTP, SFTP, SSH 등 다양한 프로토콜을 자동화하는 예제가 있다. Expect와 유사한 기능을 제공하는 대안으로 C#, 자바, 파이썬, 펄, 루비 등 여러 프로그래밍 언어의 라이브러리 또는 모듈이 존재한다.

더 읽어볼만한 페이지

  • 자동화 소프트웨어 - 매크로 바이러스
    매크로 바이러스는 응용 프로그램의 매크로 기능을 악용하여 자동 실행 및 복제를 통해 시스템을 감염시키는 악성 코드로, 출처 불분명한 파일에 대한 주의 및 백신 소프트웨어 활용을 통해 예방이 필요하며, 최신 Microsoft Office에서는 관련 보호 기능을 제공한다.
  • 자동화 소프트웨어 - IFTTT
    IFTTT는 웹 서비스와 API 연동을 통해 작업 흐름을 자동화하는 플랫폼으로, 트리거와 액션을 조합한 애플릿으로 특정 조건 충족 시 미리 설정된 작업을 수행하며, 린덴 티베츠에 의해 2010년 시작되어 구독 모델 도입 후 비판을 받기도 했다.
  • 스크립트 언어 - Tcl
    Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다.
  • 스크립트 언어 - PHP
    PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다.
Expect - [IT 관련 정보]에 관한 문서
기본 정보
최신 버전5.45.4
최신 릴리스 날짜2018년 2월 4일
프로그래밍 언어C
운영 체제POSIX
Windows
라이선스퍼블릭 도메인
웹사이트Expect 공식 웹사이트
단종 여부아니오
일반 정보
작성자돈 리베스(Don Libes)
설명Tcl 스크립트 언어의 확장

2. 기초

Expect는 텔넷, FTP, passwd, fsck, rlogin, tip, SSH과 같은 상호작용 응용 프로그램의 제어를 자동화하기 위해 사용된다.[3] 의사 터미널(유닉스)을 사용하거나 콘솔을 에뮬레이트(윈도우)하여 대상 프로그램을 시작한 다음 마치 사람이 하는 것처럼 해당 프로그램과 통신하는데, 이는 터미널이나 콘솔 인터페이스를 통해 이루어진다.[4] 또 다른 Tcl 확장 기능인 Tk를 사용하여 GUI를 제공할 수 있다.[5]

Expect는 정규 표현식 패턴 매칭과 일반 프로그램 기능들이 있으므로, 프로그래밍 언어, 매크로, 기타 프로그램 매커니즘이 없는 텔넷, FTP, SSH 등의 프로그램들을 효과적으로 제어할 수 있게 한다.

Expect는 기존 유틸리티를 함께 연결하는 "접착제" 역할을 한다. 즉, Expect 내부에서 문제를 해결하는 방법을 찾는 대신, Expect가 시스템의 기존 도구를 사용하는 방법을 파악하는 것이다.

Expect의 주요 사용 사례는 상업용 소프트웨어 제품과 관련된다. 이러한 제품 중 다수는 일종의 명령줄 인터페이스를 제공하지만, 일반적으로 스크립트를 작성하는 데 필요한 기능을 갖추지 못하고 있다. 이러한 제품은 제품을 관리하는 사용자를 위해 구축되었지만, 회사는 종종 강력한 스크립팅 언어를 완전히 구현하는 데 자원을 투자하지 않는다. Expect 스크립트는 셸을 시작하고, 환경 변수를 찾고, 더 많은 정보를 검색하기 위해 일부 유닉스 명령을 수행한 다음, 사용자의 목표를 달성하는 데 필요한 정보를 갖춘 제품의 명령줄 인터페이스로 들어갈 수 있다. 명령줄 인터페이스를 통해 제품과 상호 작용하여 정보를 검색한 후, 스크립트는 어떤 조치를 취할지에 대해 지능적인 결정을 내릴 수 있다.

Expect 작업이 완료될 때마다 결과는 `$expect_out`이라는 로컬 변수에 저장된다. 이를 통해 스크립트는 사용자에게 피드백을 제공하기 위한 정보를 수집할 수 있으며, 상황에 따라 다음에 보낼 내용에 대한 조건부 동작도 가능하게 한다.

Expect의 일반적인 사용 사례는 프로그램, 유틸리티 또는 임베디드 시스템에 대한 테스트 제품군을 설정하는 것이다. DejaGnu는 테스트에 사용하기 위해 Expect를 사용하여 작성된 테스트 제품군이며, GCC 및 임베디드 개발과 같은 원격 대상 테스트에 사용되었다.

Expect 스크립트는 'autoexpect'라는 도구를 사용하여 자동화할 수 있다. 이 도구는 사용자의 작업을 관찰하고 휴리스틱을 사용하여 Expect 스크립트를 생성한다. 생성된 코드는 크고 다소 복잡할 수 있지만, 항상 생성된 스크립트를 조정하여 정확한 코드를 얻을 수 있다.

3. 사용법

Expect는 기존 유틸리티들을 함께 연결하는 "접착제" 역할을 한다. Expect는 시스템의 기존 도구를 활용하여 문제를 해결한다.

Expect의 주요 사용 사례는 상업용 소프트웨어 제품과 관련된다. 많은 상업용 소프트웨어 제품들이 명령줄 인터페이스를 제공하지만, 스크립트 작성에 필요한 기능이 부족한 경우가 많다. Expect 스크립트를 통해 셸을 시작하고, 환경 변수를 확인하며, 유닉스 명령을 수행하여 제품의 명령줄 인터페이스에 필요한 정보를 제공할 수 있다. 이를 통해 제품과 상호 작용하며 정보를 검색하고, 스크립트는 상황에 따라 적절한 조치를 취할 수 있다.

Expect 작업이 완료될 때마다 결과는 `$expect_out`이라는 로컬 변수에 저장된다. 이를 통해 스크립트는 사용자에게 피드백을 제공하고, 조건부 동작을 수행할 수 있다.

Expect는 프로그램, 유틸리티, 임베디드 시스템 등의 테스트 제품군을 설정하는 데에도 사용된다. DejaGnu는 Expect를 사용하여 작성된 테스트 제품군으로, GCC 및 임베디드 개발과 같은 원격 대상 테스트에 사용되었다.

3. 1. 예제

`autoexpect`라는 도구를 사용하여 expect 스크립트 생성을 자동화할 수 있다. 이 도구는 동작을 관찰하여 휴리스틱을 이용해 expect를 생성한다. 생성된 코드는 크기가 클 수 있고 다소 난해할 수 있지만, 생성된 스크립트를 수정하여 정확한 코드를 얻어내는 것이 가능하다.

다음은 텔넷을 자동화하는 스크립트 예제이다.



# $remote_server, $my_user_id, $my_password, and

# $my_command가 스크립트 앞에서 읽혔다고 가정합니다.

# 원격 서버에 Telnet 세션을 열고,

# 사용자 이름 프롬프트를 기다립니다.

spawn telnet $remote_server

expect "username:"

# 사용자 이름을 보내고, 암호 프롬프트를 기다립니다.

send "$my_user_id\r"

expect "password:"

# 암호를 보내고, 셸 프롬프트를 기다립니다.

send "$my_password\r"

expect "%"

# 미리 작성된 명령을 보내고,

# 다른 셸 프롬프트를 기다립니다.

send "$my_command\r"

expect "%"

# 명령 결과를 변수에 캡처합니다. 이것은

# 표시되거나 디스크에 기록될 수 있습니다.

set results $expect_out(buffer)

# Telnet 세션을 종료하고, 특수

# 파일 끝 문자를 기다립니다.

send "exit\r"

expect eof



다음은 FTP를 자동화하는 스크립트 예제이다.



# 타임아웃 매개변수를 적절한 값으로 설정합니다.

# 예를 들어, 파일 크기가 정말 크고 네트워크

# 속도가 실제로 문제인 경우, 이 매개변수를

# 값을 설정하는 것이 좋습니다.

set timeout -1

# 원격 서버에 FTP 세션을 열고,

# 사용자 이름 프롬프트를 기다립니다.

spawn ftp $remote_server

expect "username:"

# 사용자 이름을 보내고, 암호 프롬프트를 기다립니다.

send "$my_user_id\r"

expect "password:"

# 암호를 보내고, 'ftp' 프롬프트를 기다립니다.

send "$my_password\r"

expect "ftp>"

# 바이너리 모드로 전환하고, 'ftp' 프롬프트를 기다립니다.

send "bin\r"

expect "ftp>"

# 프롬프트를 끕니다.

send "prompt\r"

expect "ftp>"

# 모든 파일을 가져옵니다.

send "mget *\r"

expect "ftp>"

# FTP 세션을 종료하고, 특수

# 파일 끝 문자를 기다립니다.

send "bye\r"

expect eof



다음은 SFTP를 (암호와 함께) 자동화하는 예제이다.



#!/usr/bin/env expect -f

# 연결을 시도하는 프로시저; 성공 시 0, 그렇지 않으면 1 반환

proc connect {passw} {

expect {

"Password:" {

send "$passw\r"

expect {

"sftp*" {

return 0

}

}

}

}

# 시간 초과

return 1

}

# 입력 매개변수를 읽습니다.

set user [lindex $argv 0]

set passw [lindex $argv 1]

set host [lindex $argv 2]

set location [lindex $argv 3]

set file1 [lindex $argv 4]

set file2 [lindex $argv 5]

#puts "인수 데이터:\n";

#puts "user: $user";

#puts "passw: $passw";

#puts "host: $host";

#puts "location: $location";

#puts "file1: $file1";

#puts "file2: $file2";

# 모든 항목이 제공되었는지 확인합니다.

if { $user == "" || $passw == "" || $host == "" || $location == "" || $file1 == "" || $file2 == "" } {

puts "사용법: \n"

exit 1

}

# 지정된 호스트에 Sftp하고 파일을 보냅니다.

spawn sftp $user@$host

set rez [connect $passw]

if { $rez == 0 } {

send "cd $location\r"

set timeout -1

send "put $file2\r"

send "put $file1\r"

send "ls -l\r"

send "quit\r"

expect eof

exit 0

}

puts "\n서버에 연결하는 데 오류가 발생했습니다: $host, 사용자: $user 및 비밀번호: $passw!\n"

exit 1



이 예제와 같이 명령줄 인수로 암호를 사용하는 것은 커다란 보안 문제인데, 해당 머신의 다른 사용자가 ps를 실행함으로써 이 비밀번호를 읽어낼 수 있기 때문이다. 그러나 인수로 비밀번호를 지정하지 않고 비밀번호를 직접 물어보게 하는 코드를 추가할 수 있다. 이것이 더 안전하다.



stty -echo

send_user -- "비밀번호를 입력하십시오: "

expect_user -re "(.*)\n"

send_user "\n"

stty echo

set PASS $expect_out(1,string)



다음은 사용자 머신에서 자동화하는 ssh 로그인 예제이다.



# 타임아웃은 Expect에서 미리 정의된 변수이며

# 기본적으로 10초로 설정됩니다.

# spawn_id는 Expect에서 또 다른 미리 정의된 변수입니다.

# spawn 명령으로 생성된 spawn_id 핸들을 닫는 것이 좋습니다.

set timeout 60

spawn ssh $user@machine

while {1} {

expect {

eof {break}

"The authenticity of host" {send "yes\r"}

"password:" {send "$password\r"}

"*\]" {send "exit\r"}

}

}

wait

close $spawn_id


4. 대안

C#, 자바, 스칼라, 그루비, 펄, 파이썬, 루비, , 고와 같은 다른 언어로 된 다양한 프로젝트는 Expect와 같은 기능을 구현한다. 이들은 일반적으로 원래 Expect의 복제물은 아니지만 유사한 개념을 보인다.

4. 1. C#

4. 2. Erlang

https://github.com/hawk/lux lux는 Erlang에서 Expect 스타일의 실행 명령어를 갖춘 테스트 자동화 프레임워크이다.

4. 3. Go

https://github.com/google/goexpect GoExpect는 Go 언어용 Expect 유사 패키지이다.[1] https://github.com/Netflix/go-expect go-expect는 터미널 또는 콘솔 기반 프로그램 자동 제어를 위한 Go 언어용 Expect 유사 라이브러리이다.[2]

4. 4. Groovy

4. 5. Java

4. 6. Perl

4. 7. Python

4. 8. Ruby

4. 9. Rust

https://crates.io/crates/rexpect rexpect러스트(Rust) 언어를 위한 pexpect와 유사한 패키지이다.

4. 10. Scala

https://github.com/Lasering/scala-expect scala-expect는 Expect 도구의 매우 작은 하위 집합을 스칼라로 구현한 것이다.

4. 11. Shell

참조

[1] 웹사이트 Expect FAQ: Our company policy requires a license to use Expect. Where can we get a license? http://expect.source[...] 2006-10-11
[2] 서적 UNIX System Administration Handbook https://books.google[...] Pearson Education 2000-08-29
[3] 웹사이트 Automate Inputs to Linux Scripts With the expect Command https://www.howtogee[...] 2023-11-28
[4] 서적 Linux System Administration https://books.google[...] Sams Publishing 2000
[5] 웹사이트 Tcl/Tk in the Development of User-Extensible Graphical User Interfaces https://www.usenix.o[...] 2022-08-11
[6] 웹인용 Expect FAQ: Our company policy requires a license to use Expect. Where can we get a license? http://expect.source[...] 2018-04-21



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com