expect 명령 으로 Shell 의 자동화 상호작용 을 실현 합 니 다.
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 로 충분 합 니 다.
기타 설정
set timeout -1
set timeout 300
expect 는 tcl 문법 을 사용 합 니 다.
cmd arg arg arg
$foo
[cmd arg]
"some stuff"
{some stuff}
예시
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.