Shell 프로 그래 밍 의 Expect 대화 면제

6416 단어 shellLinuxexpect
Shell 프로 그래 밍 의 Expect 대화 면제
기대 개술
예상 설치
기본 명령 기대
예상 실행 방식
예상 사례
기대 개술
Expect
  • Expecttcl 을 바탕 으로 하 는 도구 이 고 Expect 자동화 제어 와 테스트 를 하 는 도구 이다.주로 shell 스 크 립 트 에서 상호작용 할 수 없 는 문 제 를 해결 합 니 다.대규모 linux 운영 에 도움 이 된다
  • linux 운영 과 개발 에서 우 리 는 원 격 로그 인 서버 를 조작 해 야 한다. 로그 인 하 는 과정 은 상호작용 의 과정 으로 입력 yes/no password 등 정 보 를 필요 로 할 수 있다.이 입력 을 모 의 하기 위해 서 Expect 스 크 립 트
  • 를 사용 할 수 있 습 니 다.
    예상 설치
    마 운 트 CD
    로 컬 YUM 소스 만 들 기
    설치 명령 실행
  • yum install expect -y
  • [root@localhost ~]# yum install expect -y
    已加载插件:fastestmirror, langpacks
    base                                                            | 3.6 kB  00:00:00     
    extras                                                          | 2.9 kB  00:00:00     
    updates                                                         | 2.9 kB  00:00:00     
    (1/4): extras/7/x86_64/primary_db                               | 152 kB  00:00:00     
    (2/4): base/7/x86_64/group_gz                                   | 165 kB  00:00:00     
    (3/4): updates/7/x86_64/primary_db                              | 1.9 MB  00:00:01     
    ...//省略部分内容...
      正在安装    : 1:tcl-8.5.13-8.el7.x86_64                                          1/2 
      正在安装    : expect-5.45-14.el7_1.x86_64                                        2/2 
      验证中      : 1:tcl-8.5.13-8.el7.x86_64                                          1/2 
      验证中      : expect-5.45-14.el7_1.x86_64                                        2/2 
    
    已安装:
      expect.x86_64 0:5.45-14.el7_1                                                        
    
    作为依赖被安装:
      tcl.x86_64 1:8.5.13-8.el7                                                            
    
    完毕!

    기본 명령 기대
    send: 사용자 의 입력 을 모 의 하 는 데 사용 할 문자열 을 프로 세 스에 보 냅 니 다.
  • 이 명령 은 자동 으로 차 를 갈 아타 지 못 하고 보통 \r (리 턴)
  • 을 추가 해 야 한다.
    expect
  • expect 의 내부 명령 은 마지막 출력 결과 에 지정 한 문자열 이 포함 되 어 있 는 지 판단 하고 있 으 면 즉시 되 돌아 갑 니 다. 그렇지 않 으 면 시간 초과 후 돌아 갑 니 다.
  • spawn 시 작 된 프로 세 스 의 출력 만 포착 할 수 있 습 니 다
  • spawn: 프로 세 스 를 시작 하고 후속 대화 정 보 를 추적 합 니 다.
    interact: 실행 완료 후 상호작용 상 태 를 유지 하고 콘 솔 에 제어 권 을 맡 깁 니 다.
    Timeout: 시간 초과 시간 을 지정 하고 기한 이 지나 면 후속 명령 을 계속 실행 합 니 다.
  • 단 위 는: 초
  • timeout -1 은 영원히 시간 을 초과 하지 않 는 다
  • 기본 값 으로 timeout10
  • 입 니 다.
    exp_ continue
  • 명령 을 계속 아래로 실행 할 수 있 도록 허용 expectsend_ user
  • 회 현 명령 은 echo
  • 에 해당 한다.
    $argv 매개 변수 배열
  • Expect 스 크 립 트 는 bash 에서 전달 하 는 매개 변 수 를 받 아들 일 수 있 습 니 다. [lindex $argv n] 를 사용 하여 얻 을 수 있 습 니 다. n0 부터 각각 첫 번 째, 두 번 째, 세 번 째.. 매개 변수
  • 를 표시 합 니 다.
    expect 스 크 립 트 는 interact 또는 expect eof 로 끝나 야 합 니 다. 자동화 작업 을 수행 하면 보통 expect eof 로 충분 합 니 다.
  • expect eof 는 끝 표 지 를 기다 리 고 있다.spawn 시 작 된 명령 이 끝 날 때 eof 표 시 를 만 듭 니 다. expect eof 어 는 이 표 시 를 기다 리 고 있 습 니 다
  • 기대 문법
    단일 분기 문법
    expect "password:" {send "mypassword\r";}

    다 분기 모드 문법
    expect "aaa" {send"AAA\r"}   //send命令不具备回车换行功能,一般要加\r或
    expect "aaa" {send"AAA\r"} expect "aaa" {send"AAA\r"}
    expect {
        "aaa" {send "AAA\r"}    //只要配置aaa或bbb或ccc中的任何一个,执行相应的send语句后退出该expect语句
        "bbb" {send "BBB\r"}
        "ccc" {send "CCC\r"}
    }
    expect {
        "aaa" {send "AAA";exp_continue}       //exp_continue表示继续后面的匹配,如果匹配了aaa,执行
        "bbb" {send "BBB";exp_continue}         完send语句后还要继续向下匹配bbb
        "ccc" {send "CCC"}
    }

    예상 실행 방식
    직접 실행
  • 사용 expect 대화 사용 면제 ssh 원 격 으로 다른 서버 에 로그 인 합 니 다. 여기 서 저 는 두 대의 Linux 서버 를 엽 니 다.
  • 
    [root@localhost ~]# vim demo19.sh     //编辑脚本文件
    #!/usr/bin/expect                     //expect二进制文件路径
    set timeout 5                         //超时时间
    log_file tast.log                     //记录日志文件存放位置
    log_user 1                            //一个用户
    set hostname [lindex $argv 0]         //设定第一个位置参数传递并设置变量名hostname
    set password [lindex $argv 1]         //设定第二个位置参数传递并设置变量名password
    spawn ssh root@$hostname              //追踪命令
    expect {                              //使用expect命令捕捉条件,设定输入信息,进行免交互设置
            "(yes/no)"                    //设定匹配条件
            {send "yes\r";exp_continue}   //条件匹配并输入内容,并继续向下匹配
            "*password"                   //设定匹配条件
            {send "$password\r"}          //条件匹配,引用位置变量输入信息
    }
    interact                               //完成后将控制权交给控制台
    [root@localhost ~]# chmod +x demo19.sh  //给脚本文件添加执行权限
    [root@localhost ~]# ./demo19.sh 192.168.144.135 123123    //执行脚本
    spawn ssh [email protected]
    The authenticity of host '192.168.144.135 (192.168.144.135)' can't be established.
    ECDSA key fingerprint is SHA256:B8IsZOFG7FbtVkIK+dMILmo0iA4OEIeVGY0GnnCbXhk.
    ECDSA key fingerprint is MD5:c2:d8:09:17:de:6e:ec:07:06:1b:ac:b6:1e:bd:62:09.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.144.135' (ECDSA) to the list of known hosts.
    [email protected]'s password: 
    Last login: Sun Oct 13 23:29:38 2019 from 192.168.144.1     //自动登录服务器
    [root@localhost ~]# ifconfig                           //查看服务器IP地址
    ens33: flags=4163  mtu 1500
            inet 192.168.144.135  netmask 255.255.255.0  broadcast 192.168.144.255    //成功登录
            inet6 fe80::a85a:c203:e2e:3f3c  prefixlen 64  scopeid 0x20
            inet6 fe80::ad78:663f:1f02:22e4  prefixlen 64  scopeid 0x20
            ether 00:0c:29:75:9f:c8  txqueuelen 1000  (Ethernet)
            ...//省略部分内容...

    삽입 실행
    [root@localhost ~]# vim demo20.sh     //编辑脚本文件
    #!/bin/bash                           
    hostname=$1                            //设置位置参数变量
    password=$2
    /usr/bin/expect <  mtu 1500
            inet 192.168.144.133  netmask 255.255.255.0  broadcast 192.168.144.255
            inet6 fe80::a85a:c203:e2e:3f3c  prefixlen 64  scopeid 0x20   //成功登出
            ether 00:0c:29:5b:d3:a0  txqueuelen 1000  (Ethernet)
            RX packets 11058  bytes 855440 (835.3 KiB)
            ...//省略部分内容...

    좋은 웹페이지 즐겨찾기