기대하다
Expect원저작자 | 돈리브스 |
---|---|
개발자 | 닐스 칼슨 |
안정된 릴리스 | 5.45.4 / 2018년 2월 , 전( |
기입처 | C |
운영 체제 | POSIX, Windows |
면허증. | 퍼블릭 도메인[1] |
웹 사이트 | core |
Expect는 Don Libes가 작성한 TCL 스크립트 언어의 확장입니다.이 프로그램은 텍스트 터미널 인터페이스를 노출하는 프로그램과의 상호작용을 자동화합니다.Expect는 1990년에 Unix 플랫폼용으로 작성된 이후 Microsoft Windows 및 기타 시스템에서 사용할 수 있게 되었습니다.
기본
Expect는 Telnet, FTP, passwd, fsck, rlogin, tip, SSH 등의 인터랙티브응용 프로그램 제어를 자동화하기 위해 사용됩니다.Expect는 유사 단말기(Unix)를 사용하거나 콘솔(Windows)을 에뮬레이트하고 대상 프로그램을 실행한 다음 터미널 또는 콘솔 인터페이스를 통해 사람이 실행하는 것처럼 대상 프로그램과 통신합니다.다른 TCL 확장 Tk를 사용하여 GUI를 제공할 수 있습니다.
사용.
![]() |
Expect는 기존 유틸리티를 연결하는 "접착제" 역할을 합니다.일반적인 생각은 Expect 내부에서 문제를 해결하는 방법을 알아내는 것이 아니라 Expect가 시스템의 기존 도구를 사용하도록 하는 방법을 알아내는 것입니다.
Expect의 주요 용도에는 상용 소프트웨어 제품이 포함됩니다.이러한 제품의 대부분은 어떤 종류의 명령줄 인터페이스를 제공하지만 일반적으로 스크립트 작성에 필요한 성능이 부족합니다.제품을 관리하는 사용자에게 서비스를 제공하기 위해 구축되었지만, 기업은 강력한 스크립트 언어를 완전히 구현하기 위해 리소스를 사용하지 않는 경우가 많습니다.Expect 스크립트는 셸을 생성하고 환경변수를 검색하며 Unix 명령어를 실행하여 더 많은 정보를 검색한 후 사용자의 목표를 달성하기 위해 필요한 정보로 무장한 상태로 제품의 명령줄 인터페이스에 들어갈 수 있습니다.명령줄 인터페이스를 통해 제품과 상호 작용하여 정보를 검색한 후 스크립트는 수행할 작업을 지능적으로 결정할 수 있습니다(있는 경우).
Expect 작업이 완료될 때마다 결과는 $expect_out이라는 로컬 변수에 저장됩니다.이를 통해 스크립트는 사용자에게 피드백하기 위한 정보를 수집할 수 있습니다.또, 상황에 근거해 다음에 송신하는 것을 조건부로 동작시킬 수도 있습니다.
Expect의 일반적인 용도는 프로그램, 유틸리티, 임베디드 시스템 등 테스트 스위트를 셋업하는 것입니다.DejaGnu는 Expect for use in testing을 사용하여 작성된 테스트 스위트입니다.GCC 테스트에 광범위하게 사용되어 임베디드 개발 등 원격 타깃 테스트에 매우 적합합니다[citation needed].
'autoexpect'라는 툴을 사용하여 Expect 스크립트 생성을 자동화할 수 있습니다.이 도구는 사용자의 작업을 관찰하고 경험적 접근법을 사용하여 Expect 스크립트를 생성합니다.생성된 코드가 크고 다소 암호화될 수 있지만 생성된 스크립트를 언제든지 조정하여 정확한 코드를 얻을 수 있습니다.
#,#$my_command 전은 대본에 읽힌달러 remote_server달러my_user_id달러 my_password를 취하다#를 원격 서버에, 사용자 프롬프트에 대한# 기다리다 텔넷 세션을 엽니다.을 낳다 텔넷달러 remote_server으로 기대하고 있"사용자 이름:"#을 보낸 사용자 이름, 그리고 기다리에 대한 암호 프롬프트를 입력합니다.보내다"달러 my_user_id\r""암호:"# 다음 프롬프트를 기다린 암호를 보내기를 기대한다.보내다"달러 my_password\r""%"# 다음# 다른 셸 프롬프트에 대한 기다려라 미리 건조된 사령부 보내기를 기대한다.보내다"달러 my_command\r""%"이 변수에 명령어를 결과를 잡아라를 기대한다.이 #, 또는 디스크에 쓰여진 표시할 수 있다.설정 결과달러 expect_out(버퍼))출구 텔넷 세션 그리고 기다리는 특별한 # 파일 끝 문자.기대한다 eof"exit\r" 보내
FTP를 자동화한 또 다른 예는 대본:.
# 적당한 값으로 제한 시간 매개 변수 설정합니다.예#의 경우 파일 크기, 네트워크)속도는 정말로 한가지 문제가, 보다 나은 이 # 매개 변수가 가치를 크다.설정 시간 초과)#을 열어 FTP세션에 원격 서버 부분, 그리고# 기다리에 대한 사용자 프롬프트를 입력합니다. 알을 낳기ftp달러 remote_server으로 기대하고 있"사용자 이름:"#을 보낸 사용자 이름, 그리고 기다리에 대한 암호 프롬프트를 입력합니다.보내다"달러 my_user_id\r""암호:"#고 'ftp의 프롬프트에 대한 기다린 암호를 보내기를 기대한다.보내다"달러 my_password\r""ftp>."#2진 모드로, 그리고 'ftp의 프롬프트에 대한 기다리전환을 기대하고 있다.보내다"bin\r""ftp>."#게 꺼. 보내"prompt\r"생각하죠"ftp>."# 모든 파일 보냅니다."mget *\r"으로 기대하고 있"ftp>."#출구 FTP세션 그리고 기다리는 특별한 # 파일 끝 문자.기대한다 eof"bye\r" 보내
다음으로 SFTP(패스워드 사용)를 자동화하는 예를 나타냅니다.
#!/usr/bin/env expect -f # 연결을 시도하는 절차입니다. 그렇지 않으면 결과 0, 그렇지 않으면 1 proc connect {passw} { expect {"passw\r" expect {send " sftp*" {return 0 } } } } # # # 시간 초과 반환 1 } # 사용자 설정 입력 매개 변수 읽기 [exindwv]argv 3] set file1 [ ex ex $ vv 4 ]set file2 [ ex ex $ vv 5 ]# 、 # 、 # " " " " 、 " user : $passw " ; # " " host : $host " ; # " " location " 、 # file 1 : $file 1 : $file 1 ; check #::::::::::::file 2 filefilefilefilefile::filefilefilefilefilefilefilefilefilefilefilefilefilefilefilefilefilefilefilefilefile}{"관습:<>user>, <, passw>,<>은<>location>,>send>에 file1,>send>에 file2, \n"1번 출구로 나온다})Sftp 지정된 호스트에 파일을 보내달러 @sftp달러 사용자 spawn 호스트 설정 rez[달러 passw 연결하]만약{달러rez == 0}{ 보내"cd달러 location\r"설정되어 타임 아웃 -1 보내"달러 file2\r을" 보내"달러 file1\r을" 보내"ls -l\r" 보냈다.` 싶어.It\r"eof 출구 0}일 경우를 기대한다"\n.서버 연결 오류: $host, 사용자: $user 및 비밀번호: $passw!\n" 출구 1
이 예시와 같이 패스워드를 명령줄 인수로 사용하는 것은 큰 보안 취약점입니다.머신의 다른 사용자는 "ps"를 실행하여 이 패스워드를 읽을 수 있기 때문입니다.다만, 인수로 패스워드를 지정하는 대신에, 패스워드의 입력을 요구하는 코드를 추가할 수 있습니다.이게 더 안전할 거예요.아래 예를 참조하십시오.
stty - echo send_user -- "비밀번호 입력: "expect_user -re (.*)\n" send_user "\n" stty echo set PASS $expect_out(1,string)
사용자 머신에 대한 SSH 자동 로그인의 또 다른 예는 다음과 같습니다.
# 타임아웃은 Expect에서 미리 정의된 변수입니다.기본적으로 #은 10초로 설정됩니다.#pron_id는 Expect의 다른 사전 정의된 변수입니다.# span 명령어로 작성된 span_id 핸들 #을 닫는 것이 좋습니다.set timeout 60이 ssh $user@machine을 생성하는 동안 {1} {expect {eof {break} "호스트의 신뢰성" {send "yes\r"} "password:" {send "$password\r"} "*\] {send "exit\r"} {send "spawn_id}}} {spawn_id}을(를 닫으십시오.
대체 수단
C#, Java, Scala, Groovy, Perl, Python, Ruby, Shell 및 Go와 같은 다른 언어로 Expect와 같은 기능을 구현하는 프로젝트도 있습니다.이들은 일반적으로 원래 예상과 정확히 일치하는 클론은 아니지만 개념은 매우 유사한 경향이 있습니다.
C#
- Expect.NET : C#(.)의 기능이 필요합니다.네트워크)
- DotNetExpect :용 Expect 콘솔 자동화 라이브러리.그물
얼랑
- lux - Expect style 실행 명령을 사용하여 자동화 프레임워크를 테스트합니다.
가세요
그루비
- expect4groovy - Expect 툴의 Groovy DSL 구현.
자바
- Expect It - Expect 툴의 순수 Java 1.6+ 구현.심플하고 사용하기 쉬우며 확장성이 뛰어나도록 설계되었습니다.
- expect4j - 원래 expect의 Java 클론 시도
- Expect J - Unix expect 유틸리티의 Java 구현
- Expect-for-Java - Expect 툴의 순수 Java 구현
- expect4java - Expect 툴의 Java 구현이지만 중첩된 폐쇄를 지원합니다.그루비 언어 DSL용 래퍼도 있습니다.
펄
파이썬
- Pexpect - 의사 단말기의 인터랙티브 프로그램을 제어하는 Python 모듈
- winpexpect : Windows 플랫폼에 대한 pexpect 포트
- paramiko-expect : Python expect와 같은 Paramiko SSH 라이브러리 확장으로 테일링 로그도 지원합니다.
루비
녹
- rexpect - Rust 언어용 펙스펙트 유사 패키지.
스칼라
- scala-expect : Expect 툴의 극히 작은 서브셋의 Scala 구현.
껍데기
- Empty : Unix 쉘 스크립트에서 대화형 명령을 실행하는 expect형 유틸리티
- sexpect : 셸을 예상합니다.클라이언트/서버 모델에 실장되어 있으며, (GNU 화면과 같이) 부가/분리도 지원합니다.
레퍼런스
추가 정보
- Libes, Don (1995). Exploring Expect: A Tcl-Based Tool for Automating Interactive Programs. O'Reilly Media. ISBN 1-565-92090-2.
- Fisher, David (1999). "Advanced Programming in Expect: A Bulletproof Interface". No. 48. Linux Gazette.
{{cite magazine}}
:Cite 매거진의 요건magazine=
(도움말)