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}
本文出自 “浪淘沙” 博客,谢绝转载!