Python pexpect 모듈 및 셸 스 크 립 트 except 원리 해석
expect 가 뭐 예요?
expect 는 인위적인 관여 없 이 자동 적 인 대화 형 임 무 를 실현 하 는 무료 프로 그래 밍 도구 입 니 다.말하자면 expect 는 자동 상호작용 기능 을 실현 하 는 소프트웨어 이다.
실제 작업 에서 우리 가 명령,스 크 립 트 또는 프로그램 을 실행 할 때,이 명령,스 크 립 트 또는 프로그램 들 은 터미널 에서 계속 실행 되 는 명령 을 입력 해 야 하 며,이 입력 들 은 모두 인위적인 수 동 으로 진행 되 어야 한다.한편,expect 를 이용 하면 프로그램의 제시 에 따라 아 날로 그 표준 입력 을 프로그램 에 제공 하여 자동화 상호작용 을 실현 할 수 있다.
Liux 의 일부 명령 은 스 크 립 트 의 자동화 운행 에 적합 하지 않 기 때문에 fdisk,telnet,ftp 연결 다운로드 등 을 사용 하여 교환 문 제 를 해결 해 야 합 니 다.
기초
다음 네 가지 명령 포함
명령 하 다.
역할.
send
프로 세 스에 문자열 보 내기
except
프로 세 스에 서 문자열 받 기
spwan
새 프로 세 스 시작
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.exppexpect 모듈
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)
상용 방법
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()
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.