expect 자동 상호작용 실현 얕 은 것 에서 깊 은 것 으로
운영 자로 서 셸 을 통 해 순환, 판단 등 간단 한 통제 기능 을 실현 할 수 있다.그러나 상호작용 이 필요 한 상황 에 대해 서 는 인공 적 으로 관여 해 야 한다. 가끔 우 리 는 텔 넷 서버 등 과 상호작용 을 하 는 기능 을 실현 해 야 할 수도 있다.expect 는 이러한 기능 을 실현 하 는 도 구 를 사용한다.expect 는 사람의 간섭 없 이 자동 과 상호작용 임 무 를 실현 하 는 무료 프로 그래 밍 도구 언어 입 니 다.
expect 설치, 직접
yum install expect -y
expect 명령명령 하 다.
해명 하 다.
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 의 모든 보고 가 틀 리 지 않 았 기 때문이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자동 로그인 서버 expect텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.