expect 자동 상호작용 실현 얕 은 것 에서 깊 은 것 으로

expect 자동 상호작용 실현 얕 은 것 에서 깊 은 것 으로
운영 자로 서 셸 을 통 해 순환, 판단 등 간단 한 통제 기능 을 실현 할 수 있다.그러나 상호작용 이 필요 한 상황 에 대해 서 는 인공 적 으로 관여 해 야 한다. 가끔 우 리 는 텔 넷 서버 등 과 상호작용 을 하 는 기능 을 실현 해 야 할 수도 있다.expect 는 이러한 기능 을 실현 하 는 도 구 를 사용한다.expect 는 사람의 간섭 없 이 자동 과 상호작용 임 무 를 실현 하 는 무료 프로 그래 밍 도구 언어 입 니 다.
expect 설치, 직접 yum install expect -yexpect 명령
명령 하 다.
해명 하 다.
spawn
새 프로 세 스 시작
send
프로 세 스에 문자열 보 내기
expect
프로 세 스에 서 문자열 받 기
interact
사용자 상호작용 허용
exp_continue
동작 을 실행 한 후에 이 명령 을 추가 하 는 여러 문자열 과 일치 합 니 다.
일반 단계:
expect 프로 세 스 (spawn) --> 프로 세 스 문자열 (expect) --> 일치 하 는 문자열 을 시작 합 니 다. 문자열 (send) 을 성공 적 으로 보 냈 습 니 다. 그렇지 않 으 면 --> 끝 날 때 까지 기 다 립 니 다.
자, 그냥 주제 에 들 어가 자. 쓸데없는 소리 하지 말고.직접 인 스 턴 스:
1. 입문 예: 자동 로그 인 실현
[root@localhost shell.sh]# vim test.exp
#!/usr/bin/expectset 
timeout 30
spawn ssh -l root 192.168.1.106
expect {
"(yes/no)?" { send "yes\r" }
"password:" { send "jiajie\r" }
}
interact

매개 변수
해명 하 다.
#!/usr/bin/expect
사용 한 셸 환경 설명
set timeout 30
시간 초과 설정, 단 위 는 초, - 1 은 제한 없 음
spawn ssh...
실행 해 야 할 명령 입 니 다. 여 기 는 ssh 로그 인 명령 입 니 다.
expect "(yes/no)?"
마지막 출력 결과 에 포함 되 었 는 지 판단 합 니 다 (yes/no).문자열
send "yes\r"
대화 동작 을 실행 하고 이전 명령 을 연결 합 니 다. 위의 expect 가 성공 하면 yes 를 보 냅 니 다.
interact
실행 이 끝 난 후 상호작용 상 태 를 유지 하고 컨트롤 러 에 제어권 을 맡긴다
이 인 스 턴 스 실행: ./test.exp잘못 보고 -bash: ./test.exp: Permission denied 하면 744 권한 을 주면 된다.
2. 사용 변수:
[root@localhost shell.sh]# vim test.exp
#!/usr/bin/expect
set ip 192.168.1.106
set user root
set password jiajie
set timeout 30
spawn ssh -l $user $ip
expect {
"(yes/no)?" { send "yes\r";exp_continue }
"password:" { send "$password\r" }
}
interact

set: 변 수 를 설정 하고 뒤에 직접 변 수 를 설정 합 니 다. "$변수 이름"을 통 해 호출 합 니 다.
3. 위치 매개 변수 사용:
[root@localhost shell.sh]# vim test.exp 

#!/usr/bin/expect
if {$argc!=3} {
        send_user "Usage:expect need three arguments:ip user password
"         exit 1         } set ip [lindex $argv 0] set user [lindex $argv 1] set password [lindex $argv 2] set timeout 30 spawn ssh -l $user $ip expect { "(yes/no)?" { send "yes\r";exp_continue } "password:" { send "$password\r" } } interact

[lindex $argv num]: 위치 매개 변 수 를 표시 하고 num = 0 부터 시작 합 니 다.
send_user: 현재 알림 을 인쇄 합 니 다. 셸 의 echo 에 해당 합 니 다.
4. 여러 명령 실행:
[root@localhost shell.sh]# vim test.exp 

#!/usr/bin/expect
if {$argc!=3} {
        send_user "Usage:expect need three arguments:ip user password
"         exit 1         } set ip [lindex $argv 0] set user [lindex $argv 1] set password [lindex $argv 2] set timeout 30spawn ssh -l $user $ip expect { "(yes/no)?" { send "yes\r";exp_continue } "password:" { send "$password\r" } } expect "]#" { send "useradd jj\r" } expect "]#" { send "echo jiajie|passwd --stdin jj\r" } send "exit\r"expect eofexit -onexit {         send_user "useradd jj is successfully.
"         send_user "Jobs has finished,Goodbye.
"         }

실행 후 결과 출력:
[root@localhost shell.sh]# ./test.exp 192.168.1.106 root jiajie
spawn ssh -l root [email protected]'s password: 
Last login: Sat Sep  9 03:47:48 2017 from web
[root@localhost ~]# useradd jj
[root@localhost ~]# echo jiajie|passwd --stdin jj
Changing password for user jj.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# exitlogout
Connection to 192.168.1.106 closed.
useradd jj is successfully.
Jobs has finished,Goodbye.

send "exit\r": 현재 환경 에 로그 인 합 니 다.
expect eof: expect 매 칭 을 끝 냅 니 다.
exit - onexit {...}: 인쇄 가 끝 난 알림 정보 입 니 다.
5. 셸 스 크 립 트 호출 expect (1)
[root@localhost shell.sh]# vim test.sh
#!/bin/bash
ip=$1
user=$2
password=$3
expect < 
  

[root@localhost shell.sh]# ./test.sh 192.168.1.106 root jiajie
spawn ssh -l root [email protected]'s password: 
Last login: Sat Sep  9 04:10:46 2017 from web
[root@localhost ~]# useradd jj
[root@localhost ~]# echo jiajie|passwd --stdin jj
Changing password for user jj.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# exit
logout
Connection to 192.168.1.106 closed.
[root@localhost shell.sh]#

5. 셸 스 크 립 트 호출 expect (2)
셸 스 크 립 트 를 통 해 expect 스 크 립 트 를 호출 하여 대량 인증 을 실현 합 니 다.
expect 스 크 립 트:
[root@localhost shell.sh]# vim scp.exp
#!/usr/bin/expect
if {$argc!=3} {
        send_user "Usage:expect need three arguments lisk thks:file host dir
"         exit 1         } set srcname [lindex $argv 0] set hostname [lindex $argv 1] set destname [lindex $argv 2] set password "jiajie" spawn scp $srcname root@$hostname:$destnameset  timeout 30 expect { #        -timeout 2         "yes/no" {send "yes\r";exp_continue}                 "*password:" {send "$password\r"} #        timeout {puts "expect connect failure,please contact admin.";return}} expect eofexit -onexit {         send_user "Jobs has finished,Goodbye.
"         }

셸 스 크 립 트:
[root@localhost shell.sh]# vim scp.sh 
#!/bin/bash
if [[ "$#" != "2" ]];then
        echo "Usage:$0 src_filename des_filename"
        exit 0
fi
IP_LIST=(        
        192.168.1.106
        192.168.1.170
        192.168.1.10)
. /etc/init.d/functions
for ip in ${IP_LIST[*]}
do
        expect scp.exp $1 $ip $2 &> /dev/null        
        if [ $? -eq 0 ];then
                action "$ip" /bin/true
        else
                action "$ip" /bin/false
        fi
done

scp. sh 스 크 립 트 는 expect 스 크 립 트 를 호출 하여 배포 기능 을 실현 합 니 다.실행 결 과 는 다음 과 같 습 니 다.
[root@localhost shell.sh]# sh  scp.sh  /etc/fstab /tmp/
192.168.1.106                                              [  OK  ]
192.168.1.170                                              [  OK  ]
192.168.1.10                                               [FAILED]

192.168.1.10 의 모든 보고 가 틀 리 지 않 았 기 때문이다.

좋은 웹페이지 즐겨찾기