pexpect是一种能按照脚本内容设定的方式与交互程序通话的程序,可以根据相应的提示作出对应的回答。

1.安装

[root@zhu ~]# yum -y install expect expect-devel

2.自动登陆ssh,并停留在远程主机上

[root@zhu ~]# cat qian.exp
#!/usr/bin/expect -f
set ip 192.168.56.102
set password 123456
set timeout 10
spawn ssh root@$ip
expect {
"*password:" { send "$password\r" }
}
interact
[root@zhu ~]# ./qian.exp
spawn ssh root@192.168.56.102
root@192.168.56.102's password:
Last login: Fri Apr  4 16:04:02 2014 from 192.168.56.101

3.自动登陆到远程主机,执行命令后退出。

[root@zhu ~]# ./shan.sh
spawn ssh root@192.168.56.102
root@192.168.56.102's password:
Last login: Fri Apr  4 16:04:48 2014 from 192.168.56.101
[root@jiang ~]# mkdir expect
[root@jiang ~]# exit
logout
Connection to 192.168.56.102 closed.
[root@zhu ~]# cat shan.sh
#!/usr/bin/expect -f
set ip 192.168.56.102
set password 123456
set timeout 10
spawn ssh root@$ip
expect {
#"*yes/no" { send "yes\r"; exp_continue}
"*password:" { send "$password\r" }
}
 expect "#*"
 send "mkdir expect\r"
 send  "exit\r"
 expect eof

expect的基本语法:

1.变量

#expect只有一种变量类型--字符型
语法:
set  变量名  值
set name "du diao han jiang xue"
set age "17"
set my "my name is $name,my age is $age"
set money \$1000
#调用系统命令
set name [exec whoami]
[ cmd ] #可以实现变量替换
% set name [exec whoami]
root
% puts $name
root
set #设置变量
puts #查看变量或打印字符,相当于echo
% puts "hello world"
hello world
% puts $name
root

2.控制流

while循环

#while循环
[root@zhu ~]# expect jiang.exp
du diao han jiang xue
du diao han jiang xue
du diao han jiang xue
du diao han jiang xue
[root@zhu ~]# cat jiang.exp
#!/usr/bin/expect
set i 1
while {$i < 5} {
puts "du diao han jiang xue"
set i [expr $i+1]
}

for循环

#for循环
for {start} {表达式} {next} {
    指令
}
#start先执行,next是循环体执行后,最后执行
[root@zhu ~]# expect jiang.exp
qian shan niao fei jue
qian shan niao fei jue
qian shan niao fei jue
[root@zhu ~]# cat jiang.exp
#!/usr/bin/expect
for {set i 1} {$i <= 5} {incr i +2} {
puts "qian shan niao fei jue"
}


#for循环总结
for {start} {expresion} {next} {
    command
}
start和next参数都是指令,start参数先执行,next参数是循环体执行后立即执行,start和next参数可以为空,但是必须有占位符。如下
for {} {1} {} {
    command
  }
#这种情况控制循环的结束应在循环体中,若没有控制结束便是一个无线循环。


if语句


[root@zhu ~]# expect jiang.exp
8 < 10
8 > 7
i = 8
[root@zhu ~]# cat jiang.exp
#!/usr/bin/expect
set i 8
if {$i < 10} {
puts "8 < 10"
}
if {$i <7} {
puts "8 < 7"
} else {
puts "8 > 7"
}
if {$i <8} {
puts "i < 8"
} elseif {$i > 8} {
puts "i > 8"
} else {
puts "i = 8"
}


#if语法格式
if { } {
}
if { } {
} else {
}
if { } {
} elseif{ } {
} else {
}

switch语句


[root@zhu ~]# expect jiang.exp
apple is blue
[root@zhu ~]# vim jiang.exp
#!/usr/bin/expect
set color "apple"
switch  $color  {
        apple {
                puts "apple is blue"
        }
        banana {
                puts "banana is yellow "
        }
}


switch  $color  {
        apple {
                puts "apple is blue"
        }
        banana {
                puts "banana is yellow "
        }
       default {
                puts "apple"
        }
}


proc :定义函数

#proc 语句定义一个函数,但又和其它语言的函数有一定的不同,更像是定义一个指令。
proc语句包含三个参数:第一个指令名;第二个参数列表;第三个代码体
[root@zhu ~]# expect jiang.exp
34
[root@zhu ~]# cat jiang.exp
#!/usr/bin/expect
proc fib {pen ult n} {
    for {set i 0} {$i<$n} {incr i} {
        set new [expr $ult+$pen]
        set pen $ult
        set ult  $new
    }
    return $pen
}
puts "[fib 0 1 9]"




3.常用指令

source  文件名

source  filename #可以调用别的文件中的变量和脚本
[root@zhu ~]# expect jiang.exp
mingyue
[root@zhu ~]# cat jiang.exp qian.exp
#!/usr/bin/expect
source /root/qian.exp
puts "[zhu mingyue]"
#!/usr/bin/expect
proc zhu { n } {
    return "$n"
}


列表:

#llength返回列表的长度
% llength "a b c"
3
% llength "abc"
1
% llength {llength "a b c"}
2
% llength [llength "a b c"]
1
#lindex和lrange可以根据索引获得列表的元素
% lindex "a b c d e" 0
a
% lindex "a b c d e" 2
c
% lrange "a b c d e" 0 2
a b c
相当于python的切片

遍历列表中的元素

[root@zhu ~]# expect jiang.exp
xue
jiang
han
diao
du
###########################
du
diao
han
jiang
[root@zhu ~]# cat jiang.exp
#!/usr/bin/expect
set list "du diao han jiang xue"
for {set i [expr [llength $list]-1]} {$i>=0} {incr i -1} {
    puts [lindex $list $i]
}
puts "###########################"
for {set i 0} {$i<[expr [llength $list]-1]} {incr i} {
    puts [lindex $list $i]
}
[root@zhu ~]# expect jiang.exp
du
diao
han
jiang
xue
[root@zhu ~]# cat jiang.exp
#!/usr/bin/expect
set list "du diao han jiang xue"
foreach i $list {
    puts "$i"
}

创建列表

% set list "ming yue ji shi you" #使用引号
ming yue ji shi you
% puts $list
ming yue ji shi you
% set list {ming yue ji shi you} #使用大括号
ming yue ji shi you
% puts $list
ming yue ji shi you
% set name "a b {c d} {e {f g {xyz}}}" #列表嵌套
a b {c d} {e {f g {xyz}}}
% puts $name
a b {c d} {e {f g {xyz}}}
% set zhu {ming yue {ji shi you}} #列表嵌套
ming yue {ji shi you}
% puts $zhu
ming yue {ji shi you}