Python pexpect 모듈 및 셸 스 크 립 트 except 원리 해석

expect 스 크 립 트
expect 가 뭐 예요?
expect 는 인위적인 관여 없 이 자동 적 인 대화 형 임 무 를 실현 하 는 무료 프로 그래 밍 도구 입 니 다.말하자면 expect 는 자동 상호작용 기능 을 실현 하 는 소프트웨어 이다.
실제 작업 에서 우리 가 명령,스 크 립 트 또는 프로그램 을 실행 할 때,이 명령,스 크 립 트 또는 프로그램 들 은 터미널 에서 계속 실행 되 는 명령 을 입력 해 야 하 며,이 입력 들 은 모두 인위적인 수 동 으로 진행 되 어야 한다.한편,expect 를 이용 하면 프로그램의 제시 에 따라 아 날로 그 표준 입력 을 프로그램 에 제공 하여 자동화 상호작용 을 실현 할 수 있다.
Liux 의 일부 명령 은 스 크 립 트 의 자동화 운행 에 적합 하지 않 기 때문에 fdisk,telnet,ftp 연결 다운로드 등 을 사용 하여 교환 문 제 를 해결 해 야 합 니 다.
기초
다음 네 가지 명령 포함
명령 하 다.
역할.
send
프로 세 스에 문자열 보 내기
except
프로 세 스에 서 문자열 받 기
spwan
새 프로 세 스 시작
interact
사용자 상호작용 허용
  • send 명령 은 문자열 인 자 를 받 고 이 인 자 를 프로 세 스 로 보 냅 니 다.
  • expect 명령 은 send 명령 과 반대로 expect 는 보통 프로 세 스 의 피드백 을 기다 리 는 데 사 용 됩 니 다.저 희 는 프로 세 스 의 피드백 에 따라 해당 하 는 대화 명령 을 보 냅 니 다.
  • spawn 명령 은 새로운 프로 세 스 를 시작 하 는 데 사 용 됩 니 다.spawn 후의 send 와 expect 명령 은 모두 spawn 으로 열 린 프로 세 스 와 상호작용 을 합 니 다.
  • interact 명령 은 사실 많이 사용 되 지 않 습 니 다.일반적인 상황 에서 spawn,send,expect 명령 을 사용 하면 우리 의 임 무 를 잘 수행 할 수 있 습 니 다.그러나 일부 특수 한 상황 에서 interact 명령 을 사용 해 야 한다.interact 명령 은 주로 자동 화 를 종료 하고 인공 적 인 상호작용 에 들 어 가 는 데 사용 된다.예 를 들 어 우 리 는 spawn,send,expect 명령 을 사용 하여 ftp 로그 인 호스트 를 완 료 했 고 다운로드 파일 작업 을 실 행 했 습 니 다.그러나 우 리 는 파일 다운로드 가 끝 난 후에 도 ftp 명령 행 상태 에 머 물 러 후속 명령 을 수 동 으로 수행 할 수 있 기 를 바 랍 니 다.이때 interact 명령 을 사용 하면 이 작업 을 잘 수행 할 수 있 습 니 다.
  • 코드 예
    
    #!/usr/bin/expect
    
    set timeout 30
    set host "101.200.241.109"
    set username "root"
    set password "123456"
    
    spawn ssh $username@$host
    expect "*password*" {send "$password\r"}
    interact
    이것 은 매우 간단 한 코드 로 기본 적 인 용법 을 보 여 주 었 다.
    #!/usr/bin/expect:이 스 크 립 트 를 expect 로 설명 합 니 다.
    set timeout 30:시간 초과 설정,단 위 는 초,기본 상황 에서 10 초 입 니 다.
    set host"101.200.241.109":변 수 를 설정 합 니 다.
    spawn ssh$username@$host:spawn 은 expect 환경 에 들 어가 야 실행 할 수 있 는 expect 내부 명령 입 니 다.expect 를 설치 하지 않 거나 기본 SHELL 에서 실행 하지 않 으 면 spawn 명령 을 찾 을 수 없습니다.그것 의 주요 기능 은 ssh 실행 프로 세 스에 케이스 를 추가 하여 상호작용 명령 을 전달 하 는 것 이다.
    expect"password":여기 expect 도 expect 의 내부 명령 입 니 다.이 명령 은 마지막 출력 결과 에"password"문자열 이 포함 되 어 있 는 지 판단 하고 있 으 면 즉시 되 돌려 줍 니 다.그렇지 않 으 면 일정 시간 을 기 다 렸 다가 돌아 갑 니 다.여기 서 기다 리 는 시간 은 앞에서 설정 한 30 초 입 니 다.
    send"$password\r":출력 결과 와 일치 할 때 열 린 ssh 프로 세 스에 암 호 를 보 내 고 상호작용 을 수행 합 니 다.
    interact:실행 이 완 료 된 후에 상호작용 상 태 를 유지 하고 제어 권 을 콘 솔 에 맡 기 면 이 럴 때 손 으로 조작 할 수 있 습 니 다.이 로그 인 이 완료 되 지 않 으 면 원 격 터미널 에 있 는 것 이 아니 라 종료 합 니 다.
    이것 은 바로 상기 간단 하고 간단 한 스 크 립 트 에 대한 분석 이다.상기 사례 에서 expect 에서 매우 중요 한 개념 인 모델-동작 과 관련된다.즉,상기 expect"password"{send"$password\r"}이 코드 가 표현 한 의미 입 니 다.
    모드-동작
    expect"password"{send"$password\r"}이 코드 를 결합 하여"모드-동작"이 라 고 말 합 니 다.쉽게 말 하면 하나의 패턴 에 맞 게 해당 하 는 동작 을 수행 하 는 것 이다.password 문자열 에 일치 하면 암 호 를 입력 하 십시오.
    다음 과 같다.
    
    expect {
      "password" {
        send "$password\r"
        exp_continue
      }
      eof
      {
        send "eof"
      }
    }
    그 중 expcontine 은 순환 식 매 칭 을 표시 합 니 다.보통 매 칭 후 문 구 를 종료 하지만 exp 가 있 으 면contine 은 반복 적 으로 일치 하고 여러 명령 을 입력 하여 쓰기 방법 을 간소화 할 수 있 습 니 다.
    인삼 을 전하 다
    스 크 립 트 에 파 라 메 터 를 전달 해 야 할 때 가 많 습 니 다.이 코드 를 통 해 expect 에서 파 라 메 터 를 어떻게 사용 하 는 지 알 아 보 겠 습 니 다.
    
    #!/usr/bin/expect
    
    if {$argc < 3} {
      puts "Usage:cmd <host> <username> <password>"
      exit 1
    }
    
    set timeout -1
    set host [lindex $argv 0] 
    set username [lindex $argv 1]
    set password [lindex $argv 2]
    
    spawn ssh $username@$host
    expect "*password*" {send "$password\r"}
    interact
    expect 에서\$argc 는 매개 변수 개 수 를 표시 하고 매개 변 수 는$argv 에 저 장 됩 니 다.예 를 들 어 첫 번 째 매개 변 수 는[lindex$argv]입 니 다.
    FTP 다운로드 expect 스 크 립 트
    yum 으로 expect 설치 하기
    yum install expect
    expect 스 크 립 트 를 다음 과 같이 작성 합 니 다.
    
    #!/usr/bin/expect -f 
    set ip [lindex $argv 0]                           #        ,     IP  
    set file [lindex $argv 1]                          #        ,        
    set timeout 10                                #      10 
    spawn ftp $ip                                 #  ftp $ip  
    expect "Name*"                               #    Name  
    send "anonymous \r"                           #   anoymous(    )   
    expect "Password:*"                           #    Password  
    send "\r"                                     #      
    expect "ftp>*"                                 #    ftp>  
    send "get $file\r"                               #   get $file  
    expect {
      "*Failed*" { send_user " Download failed\r";send "quit\r"}  #         Failed,       ,send_user     Download failed 
      "*send*" { send_user " Download ok\r";send "quit\r"} #         send,       ,send_user     Download ok
      }
    expect eof  #      
    스 크 립 트 에 실행 가능 한 권한 chmod+x expect 추가ftp_auto.exp
    pexpect 모듈
    pexpect 는 Liux 에서 expect 의 python 패키지 로 이해 할 수 있 습 니 다.pexpect 를 통 해 ssh,ftp,passwd,telnet 등 명령 의 자동 상호작용 을 실현 할 수 있 습 니 다.
    pip install pexpect 설치
    ssh 자동 로그 인 을 간단하게 실현 하 는 예 는 다음 과 같다.
    
    import pexpect
    child = pexpect.spwan('scp foo user#expample.com:.')  #spwan  scp  
    child.expect('Password:')          #expect            ,            
                                                #‘Password:'
    child.sendline(mypassword)       #            
    핵심 구성 요소
    spawn 클래스
    spawn 은 pexpect 의 주요 입구 입 니 다.기능 은 하위 프로그램 을 시작 하고 제어 하 는 것 입 니 다.다음은 구조 함수 입 니 다.
    class pexpect.spwan(command,args=[],timeout=30,maxread=2000,searchwindowsize=None,logfile=None,cwd=None,env=None,ignore_sighup=True)
    그 중에서 command 인 자 는 임의로 알려 진 시스템 명령 일 수 있 습 니 다.예 를 들 어child=pexpect.spawn('user/bin/ftp')하위 프로그램 이 인자 가 필요 할 때 파 라 메 터 를 대체 하기 위해 python 목록 을 사용 할 수 있 습 니 다.예 를 들 어child = pexpect.spwan('user/bin/ssh [email protected]')
    매개 변수 timeout 은 결 과 를 기다 리 는 시간 초과 입 니 다.maxread 는 터미널 콘 솔 에서 한 번 에 읽 는 최대 바이트 수 입 니 다.searchwindowsize 매개 변 수 는 일치 하 는 버퍼 문자열 의 위치 입 니 다.기본 값 은 시작 위치 와 일치 합 니 다.
    주의해 야 할 것 은 pexpext 는 셸 명령 의 메타 문 자 를 분석 하지 않 습 니 다.리 셋>파이프|또는 어댑터 를 포함 합 니 다.이 때 세 개의 특수 메타 문자 명령 을/bin/bash 의 매개 변수 로 호출 할 수 있 습 니 다.
    child =expect.spwan('/bin/bash -c "ls -l | grep LOG> logs.txt"')
    child.expect(pexpect.EOF)
    명령 의 인 자 를 PYTHON 목록 으로 바 꾸 어 문법 을 더욱 명확 하 게 할 수 있 습 니 다.아래 코드 는 위의 코드 와 같 습 니 다.
    shell_cmd='ls -l | grep LOG >logs.txt'
    child=pexpext.spwan('/bin/bash',['-c,shell_cmd])
    child.expect(pexpect.EOF)
    디 버 깅 코드 에서 pexpect 의 입력 과 출력 정 보 를 가 져 와 일치 하 는 상황 을 알 고 싶 습 니 다.하 나 는 로그 에 쓰 고 다른 하 나 는 표준 출력 으로 출력 합 니 다.
    로그 에 쓰기
    chidl-pexpect.spwan('some_command')
    fout=file('mylog.txt,'w')
    child.logfile=fout
    표준 출력 으로 출력 하 는 방법
    child=pexpect.swpan('some_command')
    chuld.logfile=sys.stdout
    다음은 SSH 원 격 로그 인 예 를 들 어 로그 인 성공 후/home 디 렉 터 리 의 파일 을 표시 하고 입력 과 출력 을 기록 합 니 다.
    
    import pexpect
    import sys
    
    child=pexpect.spawn('ssh [email protected]')
    fout=open('mylog.txt','w')
    child.logfile=fout
    #child.logfile=sys.stdout
    
    child.expect('password:')
    child.sendline('abc@123')
    child.expect('#')
    child.sendline('ls /home')
    child.expect('#')
    expect 방법
    expect 는 서브루틴 출력 과 일치 하 는 규칙 을 정의 합 니 다.
    방법 정의:expect(pattern,timeout=-1,searchwindowsize=-1)
    그 중에서 매개 변수 pattern 은 문자열,pexpext.EOF(버퍼 를 가리 키 며 일치 하 는 항목 이 없 음),pexpect,TIMEOUT(일치 하 는 대기 시간 초과),정규 표현 식 이나 목록 을 표시 합 니 다.
    매개 변수 timeout 은 일치 하 는 결 과 를 기다 리 는 시간 초과 시간 을 지정 합 니 다.단 위 는 초 입 니 다.시간 초과 가 실 행 될 때 expect 는 pexpext.TIMEOUT 에 일치 합 니 다.매개 변수 searchwindowsize 는 일치 하 는 버퍼 문자열 의 위치 입 니 다.기본 값 은 시작 위치 와 일치 합 니 다.
    read 관련 방법
    아래 의 방법 은 모두 서브루틴 에 응답 명령 을 보 내 는 것 이다.
    send(self,s)\#명령 을 보 내 고 돌아 오지 않 습 니 다.
    sendline(self,s='),\#명령 을 보 내 고 차 로 돌아 갑 니 다.
    snedcontrol(self.char)\#제어 문자 보 내기
    sendeof()\#보 내기 eof
    run 함수
    run 시 pexpext 를 사용 하여 외부 명령 을 호출 하 는 함수
    from pexpect import *
    run('scp foo [email protected]:.',events={'(?i)password':mypassword])
    pxssh 클래스
    ssh 세 션 작업 에 대한 패키지 다시 만 들 기
    class pexpext.pxssh.pxssh(timeout=30,maxread=2000,searchwindwosize=None,logfile=None,cwd=None,env=None)
    상용 방법
  • login()ssh 연결 구축
  • logout()연결 끊 기
  • promp()대기 시스템 프롬프트,명령 실행 종료 대기
  • 
    import pxssh
    import getpass
    try:
      s = pxssh.pxssh()                 #    s
      hostname = raw_input('hostname: ')
      username = raw_input('username: ')
      password = getpass.getpass('password: ')  #      
      s.login (hostname, username, password)   #  ssh  
      s.sendline ('uptime') #   uptime  
      s.prompt()       #        
      print s.before     #                 
      s.sendline ('ls -l')
      s.prompt()
      print s.before
      s.sendline ('df')
      s.prompt()
      print s.before
      s.logout()
    except pxssh.ExceptionPxssh, e:
      print "pxssh failed on login."
      print str(e)
    FTP 자동 조작
    자동 상호작용 로그 인 FTP 작업 실현
    
    import pexpect
    import sys
    
    child = pexpect.spawnu('ftp ftp.openbsd.org') #  ftp  
    child.expect('(?i)name .*: ')   #(?!)                  
    child.sendline('anonymous')  #   ftp    
    child.expect('(?i)password')  #      
    child.sendline('[email protected]')  
    child.expect('ftp> ')
    child.sendline('bin')   #       
    child.expect('ftp> ')
    child.sendline('get robots.txt') 
    child.expect('ftp> ')
    sys.stdout.write (child.before)  #     "ftp"          
    print("Escape character is '^]'.
    ") sys.stdout.write (child.after) sys.stdout.flush() child.interact() # Escape character defaults to ^] # , , "^]" child.sendline('bye') child.close()
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기