expect 스 크 립 트
만약 에 두 대의 호스트 A 와 B 가 있다 면 A 호스트 ssh 에서 B 호스트 까지 하고 B 호스트 에서 명령 을 수행 하 기 를 원 합 니 다. 실행 가능 한 명령 은
ssh usrname@hostB "command"
입 니 다. 매번 비밀 번 호 를 입력 해 야 하 는 동시에 복잡 한 논리 나 명령 을 실행 할 수 없습니다. 복잡 한 명령 을 자동화 할 수 있 는 방법 이 있 습 니까?expect 는 자동화 제어 와 테스트 를 하 는 소프트웨어 도구 입 니 다.우리 가 명령, 스 크 립 트, 프로그램 을 실행 할 때, 이 명령, 스 크 립 트, 프로그램 들 은 터미널 에서 실행 중인 명령 을 수 동 으로 입력 해 야 한다.expect 를 이용 하여 우 리 는 프로그램의 출력 알림 에 따라 표준 입력 을 모 의 하고 인공 두 드 리 기 명령 을 대체 하여 프로그램 에 제공 하여 자동화 상호작용 을 실현 할 수 있 습 니 다.
# 例如一个远程登录到主机上执行相关命令的 expect 脚本可以这么写
#!/usr/bin/expect
set host "xx.xx.xx.xx"
set username "xxx"
set password "xxx"
spawn ssh -o "StrictHostKeyChecking no" $username@$host
expect "*assword*"
send "$password\r"
expect "*$*"
send "command
"
expect "*$*"
send "exit
"
expect eof
# 你也许感觉出来了整个执行流程的模式,expect 顾名思义,就是期待一个什么输出,然后执行一个动作。
일반 필드 의 명령 은:
명령 하 다.
역할.
send
문자열 인 자 를 받 고 이 인 자 를 프로 세 스 로 보 냅 니 다.
expect
send 와 반대로 프로 세 스 의 피드백 을 기다 리 는 데 사 용 됩 니 다. 저 희 는 프로 세 스 의 피드백 에 따라 해당 하 는 대화 명령 을 보 냅 니 다.
spawn
프로 세 스 를 시작 합 니 다. spawn 이후 send 와 expect 명령 은 spawn 으로 열 린 프로 세 스 와 대화 합 니 다.
interact
자동 화 를 종료 하고 인공 상호작용 에 들 어 갑 니 다.예 를 들 어 저 희 는 spawn, send, expect 명령 을 사용 하여 ftp 로그 인 호스트 를 완 료 했 고 다운로드 파일 작업 을 실 행 했 습 니 다. 파일 다운로드 가 끝 난 후에 도 ftp 명령 행 상태 에 머 물 러 후속 명령 을 수 동 으로 수행 할 수 있 도록 interact 명령 을 사용 하면 이 작업 을 잘 수행 할 수 있 습 니 다.
send_user
사용자 에 게 데 이 터 를 보 내 는 문자열 인 자 를 받 습 니 다.
set timeout xx
시간 초과 설정, 단 위 는 s, 기본 값 은 10 입 니 다.
set send_slow {10 0.001}
입력 주파 수 를 설정 합 니 다. 10 글자 마다 1ms 간격 입 니 다.
sleep
시스템 응답 등에 제한 을 받 는 경우 이 문 구 를 삽입 하여 실행 이 끝 날 때 까지 기다 리 고 다음 문 구 를 실행 합 니 다.
exp_continue
expect {
pattern {
action
} pattern {
action
} pattern {
action
}
}
最后一个 expect 语句后面的 send 语句都不执行,为了让所有 send 语句都执行,可以用一个不带 send 的 expect 语句结尾。
expect "*$*"
send "pwd
"
send "ls -l
"
send_user "suscess
" # 执行
expect "*$*" # 可添加一个 expect
spawn 이 여러 프로 세 스 를 만 들 었 다 면 send 를 어떻게 구분 하 느 냐 고 물 어 볼 것 이다.send 명령 은 이 동작 을 지원 하 는 옵션 을 가 져 올 수 있 습 니 다. 예 를 들 어
spawn telnet ip port
set TELNETID $spawn_id
send -i $TELNETID 用来向不同进程发送命令,是进行多程序控制的关键参数
send -s "xxx" s 代表 slowly,也就是控制发送的速度,这个参数使用的时候要与expect中的变量send_slow相关联
명령 행 매개 변수 가 져 오기
#!/usr/bin/expect
# 判断输入的参数是否为 3 个,如果不为 3 个,就打印错误信息,退出该程序。
if { $argc != 3 } {
puts stderr "Usage: test1 host-address username host-password
"
exit 1
}
set timeout 60
set host [lindex $argv 0] # 命令行参数获取,从真实的参数开始计算,expect xx.exp ARG0 ARG1 ...
set name [lindex $argv 1]
set password [lindex $argv 2]
##set host "192.168.0.4"
##set name “root”
##set password "cluster"
# root 用户的 rsa key 放在 /root/.ssh 中,其他用户则放在 /home/$name/.ssh
if { $name == "root"} {
spawn scp /$name/.ssh/id_rsa.pub $name@$host:/tmp
} else {
spawn scp /home/$name/.ssh/id_rsa.pub $name@$host:/tmp
}
# 等待上个命令的响应
expect {
"(yes/no)?" {
send "yes
"
expect "assword:"
send "$pasword
"
} "assword:" {
send "$password
"
}
}
# 输入密码后,拷贝成功,出现 100% 字符串,作为预期响应
expect "100%"
# 调用 ssh 以 $name 用户名登录到 $host 上
spawn ssh $host – l$name
expect "assword:"
send "$password
"
expect ":~#"
# 将刚刚拷贝的 rsa key 添加到用户的 home 目录下的 ./ssh/authorized_keys
if { $name == "root"} {
send "cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys
"
} else {
send "cat /tmp/id_rsa.pub >> /home/$name/.ssh/authorized_keys
"
}
expect ":~#"
# 操作成功后,退回 SSH 客户端机器
send "exit
"
expect "#"
# 下面将测试能否自动登录,不用输入密码
spawn ssh $host – l$name
expect {
"Welcome" {
send_user "Auto login the server successfully!"
} "assword:" {
send_user "failed to login the server!"
}
}
send "ls
"
expect ":~#"
# 退出 $host
send "exit
"
# 程序结束
expect eof
함수.
# definition
proc funcname {para1 para2} {
command
command
}
funcname para1 para2
# if
if {xxx} {
...
} else {
...
}
# for
for {set i 0} {$i < xxx} {incr i} {
....
}
# foreach
# while
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Rails Turbolinks를 페이지 단위로 비활성화하는 방법원래 Turobolinks란? Turbolinks는 링크를 생성하는 요소인 a 요소의 클릭을 후크로 하고, 이동한 페이지를 Ajax에서 가져옵니다. 그 후, 취득 페이지의 데이터가 천이 전의 페이지와 동일한 것이 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.