expect 스 크 립 트

4587 단어 #Shell
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

좋은 웹페이지 즐겨찾기