ssh expect 상호작용

8378 단어 sshexpectshell
인터넷 에서 expect 상호작용 에 대한 설명 을 많이 찾 았 지만 상세 하지 않 고 용법 만 간단하게 밝 혔 다.
현재 정리 압축 파일 아래:
1. expect 약술:
  Expect 는 Tcl 기반 의 고급 언어 로 서 특수 한 문법 을 추 가 했 습 니 다. 또한 Expect 는 Perl 과 Python 언어 에 모듈 방식 으로 이식 되 었 기 때문에 사용자 역시 Perl 과 Python 스 크 립 트 에서 Expect 의 강력 한 상호작용 기능 을 이용 할 수 있 습 니 다. 
Send, expect, spwan 은 expect 언어의 가장 기본 적 인 명령 입 니 다.그 중에서 send 명령 은 지정 한 프로 세 스 (process) 에 문자열 을 보 냅 니 다.
expect 명령 은 이 프로 세 스 가 돌아 오 는 결 과 를 기다 리 고 돌아 오 는 문자열 에 따라 다음 작업 을 결정 합 니 다.
spwan 명령 은 프로 세 스 를 실행 할 수 있 습 니 다.
send 명령 은 지정 한 프로 세 스에 매개 변수 로 문자열 을 받 습 니 다.예 를 들 어 send "hello world"send 는 문자열 "Hello world"(따옴표 없 음) 를 보 냅 니 다.만약 Expect 가 이미 어떤 프로그램 과 상호작용 을 시작 했다 면 이 문자열 은 이 프로그램 에 전 송 될 것 입 니 다.일반적으로 표준 출력 에 보 내 는 것 이 고 expect 명령 은 응답 을 기다 리 는 것 입 니 다. 보통 expect 가 대화 하고 있 는 프로 세 스 나 표준 입력 장치 에서 온 것 입 니 다.지정 한 문자열 이나 주어진 정규 표현 식 을 만족 시 키 는 모든 문자열 을 기다 릴 것 입 니 다.
2. expect 명령 실행 옵션:
1) -c  명령 행 에서 expect 스 크 립 트 실행
#expect -c  'expect ""' {send "pressed enter"}  입력 대기 줄 바 꾸 기 를 실행 하고 Enter 를 누 르 면 presssed enter 가 인쇄 됩 니 다.
2) -i 옵션 대화 실행 스 크 립 트
#expect -i arg1 arg2 arg3
expect1.1>set argv
arg1 arg2 arg3
expect1.2>
정상 적 인 상황 에서 - i 를 추가 하지 않 으 면 arg 1 을 스 크 립 트 파일 이름 으로 생각 합 니 다. - i 옵션 을 사용 하면 스 크 립 트 가 여러 개의 인 자 를 연속 적 인 목록 으로 볼 수 있 습 니 다.
3) - d 디 버 깅 스 크 립 트 정보
\# expect - d 스 크 립 트 이름
4) 명령 행 인자 읽 기
cat print_cmdline_args.exp
   
   
   
   
  1. #!/usr/bin/expect  
  2. puts 'agrv0 : [ lindex $argv 0]';puts 'argv1 : [lindex $argv1]';  
  3. 读入第一个和第二个参数 

 #expect  print_cmdline_args.exp aa bb    이 스 크 립 트 를 실행 하여 aa, bb 인 자 를 전달 합 니 다.
3. expect 문법
 1) expect partlist1 action1 partlist2 action2
   
   
   
   
  1. #!/usr/bin/expect  
  2. pwd=12345 
  3. timeout=300s    默认10s  
  4. expect {  
  5.       -re "password:" {send "$pwd
    "}  
  6.       -re "yes
    o:" {send "yes
    "}  
  7. }  
  8. expect一直等到当前进程的输出和以上的某一个模式相匹配(如:返回要求输入的密码)或等到timeout超时,或等到遇到了文件的结束为止。  

모든 partlist 는 하나의 패턴 목록 으로 구성 되 어 있 으 며, 하나의 패턴 이 일치 하면 해당 하 는 action 이 실 행 됩 니 다. 실행 결 과 는 expect 에서 돌아 갑 니 다.
2) 정확하게 일치 하 는 문자열 (또는 시간 초과 가 발생 했 을 때 일치 하 는 문자열 을 읽 었 습 니 다) 은 변수 expect 에 저 장 됩 니 다.match 에.partlist 가 eof 또는 timeout 이면 파일 이 종료 되 거나 시간 이 초과 되 었 을 때 해당 action 을 실행 합 니 다.
   
   
   
   
  1. expect "*welcome*" break  
  2.        "*busy*" {print busy;continue}  支持分号分隔多个语句  
  3.        "*failed*"  abort  
  4.        timeout   abort  
  5. 注:abort在脚本的别处有定义:  
  6.     exec sleep 4  使程序暂停4s  
  7.     spawn .... 

3) 비밀번호 변경 예:
   
   
   
   
  1. spawn passwd [index $argv 1]   以用户名作为参数启动程序  
  2. set passwd [index $argv 2]     设置密码变量  
  3. expect "*passwd:"           返回匹配到含有passwd字符,没有后继的action,则继续执行下面的语句  
  4. send "$passwd"              把密码发送给当前进程  
  5. expect "*passwd:"  
  6. send "$passwd"       
  7. 两次密码确认。  
  8. expect eof    作用是在password 的输出中搜索文件结束符.必须  

4) 더욱 완벽 한 일치 고려:
   
   
   
   
  1. spawn passwd [ index $argv 1 ]  
  2.  
  3. expect eof {exit 1}  
  4. timeout    {exit 2}  
  5.         "*No such user.*"  {exit 3}  
  6.         "*New password:"  
  7.         send "[index $argv 2]"  
  8.  
  9. expect eof {exit 4}  
  10. timeout {exit 2}  
  11.         "*Retype new password:"  
  12.         send "[index $argv 3]"  
  13.  
  14. expect timeout {exit 2}  
  15.        "*Missmatch*" {exit 6}  
  16.        "*Password unchanged*" {exit 7}  
  17.  
  18. 此脚本退出时用数字表示所发生的情况。  
  19. 如0表示password正常运行,1表示非预期死亡,2表示锁定.....  
  20. expect返回字符串和数学是一样的。 

5) 의사 단말기: 프로그램 이 실제 단말기 와 I/O 작업 을 하고 있다 고 생각 할 수 있 도록 터미널 의 미 를 제공 합 니 다.
   
   
   
   
  1. for {} {} {  
  2.          spawn ...  
  3.          expect "...." break  
  4.          ...    "...."  
  5.          close   关闭和伪终端的连接  
  6.      wait   等待退出  
  7. }  
  8. interact   进入交互终端不退出 

6) ftp 파일 샘플 추출:
   
   
   
   
  1. spawn ftp [index $argv 1]   第一个参数主机名  
  2. expect "*Name"  
  3. send "anoymous"  
  4. expect "*Password:*"  
  5. send [exec whoami]  
  6. expect "*ok*ftp>*"  
  7. send "get [index $argv 2]"  下载所需的文件  
  8. expect "*ftp>*" 

7) 제 시 된 내 명령:
expect_user   표준 입력 에서 읽 기
send_user  명령 은 표준 출력 으로 문자열 을 보 냅 니 다. expect 를 실행 할 때 send 방식 입 니 다.(현재 사용자 에 게 명령 보 내기) 예:
   
   
   
   
  1. send_user "logging in as anoymous
    "  
  2. send "anoymous\r"  
  3.  
  4. 发送操作说明型字符串 

log_user 0  표준 출력 닫 기
계속...
 
참고 설명:
http://bbs.linuxtone.org/forum.php?mod=viewthread&tid=7185

좋은 웹페이지 즐겨찾기