ssh 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
- #!/usr/bin/expect
- puts 'agrv0 : [ lindex $argv 0]';puts 'argv1 : [lindex $argv1]';
- 读入第一个和第二个参数
#expect print_cmdline_args.exp aa bb 이 스 크 립 트 를 실행 하여 aa, bb 인 자 를 전달 합 니 다.
3. expect 문법
1) expect partlist1 action1 partlist2 action2
- #!/usr/bin/expect
- pwd=12345
- timeout=300s 默认10s
- expect {
- -re "password:" {send "$pwd
"}
- -re "yes
o:" {send "yes
"}
- }
- expect一直等到当前进程的输出和以上的某一个模式相匹配(如:返回要求输入的密码)或等到timeout超时,或等到遇到了文件的结束为止。
모든 partlist 는 하나의 패턴 목록 으로 구성 되 어 있 으 며, 하나의 패턴 이 일치 하면 해당 하 는 action 이 실 행 됩 니 다. 실행 결 과 는 expect 에서 돌아 갑 니 다.
2) 정확하게 일치 하 는 문자열 (또는 시간 초과 가 발생 했 을 때 일치 하 는 문자열 을 읽 었 습 니 다) 은 변수 expect 에 저 장 됩 니 다.match 에.partlist 가 eof 또는 timeout 이면 파일 이 종료 되 거나 시간 이 초과 되 었 을 때 해당 action 을 실행 합 니 다.
- expect "*welcome*" break
- "*busy*" {print busy;continue} 支持分号分隔多个语句
- "*failed*" abort
- timeout abort
- 注:abort在脚本的别处有定义:
- exec sleep 4 使程序暂停4s
- spawn ....
3) 비밀번호 변경 예:
- spawn passwd [index $argv 1] 以用户名作为参数启动程序
- set passwd [index $argv 2] 设置密码变量
- expect "*passwd:" 返回匹配到含有passwd字符,没有后继的action,则继续执行下面的语句
- send "$passwd" 把密码发送给当前进程
- expect "*passwd:"
- send "$passwd"
- 两次密码确认。
- expect eof 作用是在password 的输出中搜索文件结束符.必须
4) 더욱 완벽 한 일치 고려:
- spawn passwd [ index $argv 1 ]
-
- expect eof {exit 1}
- timeout {exit 2}
- "*No such user.*" {exit 3}
- "*New password:"
- send "[index $argv 2]"
-
- expect eof {exit 4}
- timeout {exit 2}
- "*Retype new password:"
- send "[index $argv 3]"
-
- expect timeout {exit 2}
- "*Missmatch*" {exit 6}
- "*Password unchanged*" {exit 7}
-
- 此脚本退出时用数字表示所发生的情况。
- 如0表示password正常运行,1表示非预期死亡,2表示锁定.....
- expect返回字符串和数学是一样的。
5) 의사 단말기: 프로그램 이 실제 단말기 와 I/O 작업 을 하고 있다 고 생각 할 수 있 도록 터미널 의 미 를 제공 합 니 다.
- for {} {} {
- spawn ...
- expect "...." break
- ... "...."
- close 关闭和伪终端的连接
- wait 等待退出
- }
- interact 进入交互终端不退出
6) ftp 파일 샘플 추출:
- spawn ftp [index $argv 1] 第一个参数主机名
- expect "*Name"
- send "anoymous"
- expect "*Password:*"
- send [exec whoami]
- expect "*ok*ftp>*"
- send "get [index $argv 2]" 下载所需的文件
- expect "*ftp>*"
7) 제 시 된 내 명령:
expect_user 표준 입력 에서 읽 기
send_user 명령 은 표준 출력 으로 문자열 을 보 냅 니 다. expect 를 실행 할 때 send 방식 입 니 다.(현재 사용자 에 게 명령 보 내기) 예:
- send_user "logging in as anoymous
"
- send "anoymous\r"
-
- 发送操作说明型字符串
log_user 0 표준 출력 닫 기
계속...
참고 설명:
http://bbs.linuxtone.org/forum.php?mod=viewthread&tid=7185
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
SSH 키 쌍이 손실된 경우 EC2 인스턴스에 대한 SSH 연결 복원얼마 전에 안타깝게도 중요한 EC2 인스턴스에 속한 SSH 키 쌍을 잃어버렸습니다. 그 시점에서 우리는 방금 인스턴스의 스냅샷을 찍고 새 키 쌍으로 새 인스턴스를 생성했습니다. 이 블로그 게시물에서는 SSH 연결을 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.