注: 部分概念介绍来源于网络
1、先安装expect,expect是一套完成自动交互任务的软件,主要命令有四个:
(1).spawn:命令用来启动新的进程,spawn后的send和expect命令都是和使用spawn打开的进程进行交互
(2).expect:等待命令的反馈。
(3).set timeout命令:set timeout n命令将expect命令的等待超时时间设置为n秒,在n秒内还没有获取到其期待的命令,expect 为false,脚本会继续向下执行;timeout -1 为永不超时
(4).send:接收到反馈之后,执行的交互命令,后面添加上 \r 表示输入回车。
(5).interact:留在远程终端,并且退出自动化,进行人工交互,即可以手动写入命令。
安装expect的语句为:
yum -y install expect
2、shell代码
#!/usr/bin/expect
set timeout 30
set host "写入服务器ip"
spawn ssh $host
expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}
expect "]# " #意思为发送命令s
send "写入密码"
interact
逐句解释:
1.#!/usr/bin/expect #设置这个脚本的解释器
2.set timeout 30 #等待30s
3.set host "写入服务器ip" #设置host变量用于保存服务器ip
4.spawn ssh $host #进入expect环境下才可以执行的内部命令spawn
5.expect "password:" #判断上次输出结果是否包含“”内的内容,如果包含则立即返回,否则等待30秒
6.send "写入密码" #当匹配到输出结果中包含“password”,就发送密码到打开的ssh进程,执行交互
7.interact #登陆远程服务器之后,留在远程终端,并且可以手动交互
单一分支模式语法:
expect "hi" {send "You said hi"}
匹配到hi后,会输出"you said hi"
多分支模式语法:
expect "hi" { send "You said hi\n" } \
"hello" { send "Hello yourself\n" } \
"bye" { send "dat was unexpected\n" }
匹配到hi,hello,bye任意一个字符串时,执行相应的输出。等同于如下写法:
expect {
"hi" { send "You said hi\n"}
"hello" { send "Hello yourself\n"}
"bye" { send "That was unexpected\n"}
}