expect 명령 으로 Shell 의 자동화 상호작용 을 실현 합 니 다.

4680 단어
배경
Liux 스 크 립 트 에는 원 격 로그 인 ssh, 원 격 복사 scp, 파일 전송 sftp 등 원 격 작업 을 하 는 장면 이 많 습 니 다.이 명령 들 은 모두 보안 암호 의 입력 과 관련 되 어 있 으 며, 정상적으로 명령 을 사용 할 때 는 인공 적 으로 비밀 번 호 를 수 동 으로 입력 하고 안전 검증 을 받 아야 한다.자동화 원 격 조작 을 실현 하기 위해 서 우 리 는 expect 의 기능 을 빌 릴 수 있다.
expect
expect 의 핵심 은 spawn, expect, send, set 이다.
spawn 에서 실행 할 명령 을 호출 합 니 다.expect 명령 알림 정보 가 나타 나 기 를 기다 리 는 것 이다. 즉, 사용자 가 입력 한 알림 을 포착 하 는 것 이다. send 상호작용 이 필요 한 값 을 보 내 고 사용자 가 수 동 으로 입력 한 내용 set 설정 변수 값 interact 을 대체 하여 실행 한 후에 상호작용 상 태 를 유지 하고 컨트롤 러 에 제어권 을 맡 기 면 이 럴 때 수 동 으로 조작 할 수 있다.이 로그 인 이 완료 되 지 않 으 면 원 격 터미널 에 있 는 것 이 아니 라 종료 합 니 다.expect eof 이것 은 반드시 추가 해 야 합 니 다. spawn 과 대응 하여 터미널 출력 정보 캡 처 종 료 를 표시 합 니 다. if.. endif 와 유사 합 니 다.
expect 스 크 립 트 는 interact 나 expect eof 로 끝나 야 합 니 다. 자동화 작업 을 수행 하면 보통 expect eof 로 충분 합 니 다.
기타 설정
  • expect 설정 시간 초과 set timeout -1
  • expect 300 초 초과 설정, 300 초과 시 expect 내용 이 나타 나 지 않 으 면 종료 set timeout 300
  • expect 쓰기 문법
    expect 는 tcl 문법 을 사용 합 니 다.
  • 하나의 Tcl 명령 은 빈 칸 으로 나 누 어 진 단어 로 구성 되 어 있 습 니 다. 그 중에서 첫 번 째 단 어 는 명령 이름 이 고 나머지 는 명령 매개 변수 cmd arg arg arg
  • 입 니 다.
  • $기 호 는 변수의 값 을 대표 합 니 다. 이 예 에서 변수 이름 은 foo 입 니 다. $foo
  • 괄호 가 새 겨 진 명령 을 실 행 했 습 니 다. 예 를 들 어 명령 의 결 과 를 다른 명령 의 매개 변수 로 전달 하려 면 이 기호 [cmd arg]
  • 를 사용 하 십시오.
  • 쌍 따옴표 는 어 구 를 명령 의 매개 변수 로 표시 합 니 다. "$"기호 와 괄호 는 쌍 따옴표 에서 여전히 해석 되 고 있 습 니 다 "some stuff"
  • 대괄호 도 어 구 를 명령 의 매개 변수 로 표시 합 니 다. 그러나 다른 기 호 는 대괄호 안에서 해석 되 지 않 습 니 다 {some stuff}
  • 반사 선 기 호 는 특수 기 호 를 인용 하 는 데 쓰 인 다. 예 를 들 어 n 은 줄 을 바꾼다. 반사 선 기 호 는 '$' 기호, 따옴표, 괄호 와 대괄호 의 특수 한 의미
  • 를 닫 는 데 도 사용 된다.
    예시
    login. exp 는 원 격 로그 인 에 사용 되 며, 빠 른 사용 방법: login.exp "exclude" "${remote_ip}" "${remote_user}" "${remote_passwd}" "${remote_command}"
    #!/usr/bin/expect -f
    ##########################################################
    # 通过SSH登陆和执行命令
    #参数:1.Use_Type [check/execute]
    #     2.SSHServerIp
    #     3.SSHUser
    #     4.SSHPassword
    #     5.CommandList [多个命令间以;间隔]
    #返回值:
    #     0  成功
    #     1  参数个数不正确
    #     2  SSH 服务器服务没有打开
    #     3  SSH 用户密码不正确
    #     4  连接SSH服务器超时
    ##########################################################
    
    proc usage {} {
        regsub ".*/" $::argv0 "" name
        send_user "Usage:
    " send_user " $name Use_Type SSHServerIp SSHUser SSHPassword CommandList
    " exit 1 } ## 判断参数个数 if {[llength $argv] != 5} { usage } #设置变量值 set Use_Type [lindex $argv 0] set SSHServerIp [lindex $argv 1] set SSHUser [lindex $argv 2] set SSHPassword [lindex $argv 3] set CommandList [lindex $argv 4] #spawn ping ${SSHServerIp} -w 5 #expect { # -nocase -re "100% packet loss" { # send_error "Ping ${SSHServerIp} is unreachable, Please check the IP address.
    " # exit 1 # } #} set timeout 360 set resssh 0 #定义变量标记ssh连接时是否输入yes确认 set inputYes 0 set ok_string LOGIN_SUCCESS if {$Use_Type=="check"} { #激活ssh连接,如果要需要输入yes确认,输入yes,设置inputYes为1,否则输入ssh密码 spawn ssh ${SSHUser}@${SSHServerIp} "echo $ok_string" } else { spawn ssh ${SSHUser}@${SSHServerIp} "$CommandList" } expect { -nocase -re "yes/no" { send -- "yes
    " set inputYes 1 } -nocase -re "assword: " { send -- "${SSHPassword}
    " set resssh 1 } #-nocase -re "Last login: " { # send -- "${CommandList}
    " #} $ok_string {} -nocase -re "Connection refused" { send_error "SSH services at ${SSHServerIp} is not active.
    " exit 2 } timeout { send_error "Connect to SSH server ${SSHUser}@${SSHServerIp} timeout(10s).
    " exit 4 } } #如果输入了yes确认,输入ssh密码 if {$inputYes==1} { expect { -nocase -re "assword: " { send -- "${SSHPassword}
    " set resssh 1 } } } #如果出现try again或者password:提示,说明输入的用户密码错误,直接退出。 if {$resssh==1} { expect { -nocase -re "try again" { send_error "SSH user:${SSHUser} passwd error.
    " exit 3 } -nocase -re "assword:" { send_error "SSH user:${SSHUser} passwd error.
    " exit 3 } eof {} } } send_error -- "$expect_out(buffer)" #-nocase -re "No such user" { # send_error "No such user.
    " # exit 5 # } #exit

    좋은 웹페이지 즐겨찾기