先简单的介绍一下expect的使用实例
通常是用来ftp或者ssh交互时必须要人工操作的
但是、有的时候需要批量操作多台机器的时候、也不能一台一台的处理
那么expect的脚本就可以用的上了、
但是expect有一个比较大的弊端、就是它是一个脚本的语言
所有的代码全世界都可以看懂
那么安全问题就是一个很大的问题、
首先不的不说的就是权限的问题、一定要给的就是700、
其它用户一定不要有读权限
接下来贴一段expect的代码,这也是我测试用的ssh
#!/usr/bin/expect -f spawn ssh ll@localhost expect "*password:" send "123456\r" expect "*$*" send "echo ‘hello world‘\r" send "sleep 1\r" send "exit\r" expect eof
第一行是一个魔法串、用来告诉解释器本脚本是expect
spawn 之后加上的就是你打算的操作、可以全部替换成变量的那种操作如果
是为了方便的话
expect 加上的就是你想要期待的字符、一般用的是 *关键字* 如果你确定
你的匹配不会出错、那么怎么匹配都没问题
匹配以后的send就是相当于手打的一样、最后加上一个\r代表回车
这就是最简单的一个流程
还有一种就是用花括号的方法来做,一会有机会介绍一下
expect { "*yes/no*" { send "yes\n"} "*password*" {send "123456\r"} }
这里需要注意的就是、expect 与花括号之间需要一个空格间隔
或者就是加一个tab都没问题
还有就是 expect “*$” 或者 “*#” 后面一般匹配PS1后面加个空格
要不就加个 * 通配符,省的半天不知道错哪
接下来介绍一下另一种匹配的问题,
按照正常的来说、一般expect会用的匹配就是linux的正则、
跟sed等的正则不一样、*是一个通配符、但是
某些时候需要匹配的东西用通配符搞不定
那么就可以使用正则表达式
就是通常sed、awk用到的正则
接下来贴一下代码
就是上一个的改进版
#!/usr/bin/expect -f spawn ssh ll@localhost expect -re "^.*password.*$" send "123456\r" expect "*$*" send "echo ‘hello world‘\r" send "sleep 5\r" send "exit\r" expect eof
仅仅是第四行有了一些改变、毕竟是为了实验
加了一个 -re 参数、re就是正则regular的缩写
之后的“”之间就可以利用正则来写了、个人感觉用处不大
一般通配符就搞定了、为了文章的完整性、就写一下把
Expect中最关键的四个命令是send,expect,spawn,interact。
send:用于向进程发送字符串
expect:从进程接收字符串
spawn:启动新的进程
interact:允许用户交互
接下来介绍一下interact表示允许用户交互、也是一个比较鸡肋的用途把
贴一下代码
root@lp:~/pwb/tmp# cat ssh3.exp #!/usr/bin/expect -f spawn ssh ll@localhost expect -re "^.*password.*$" send "123456\r" expect "*$*" send "echo ‘hello world‘\r" send "sleep 5\r" interact root@lp:~/pwb/tmp# ./ssh3.exp spawn ssh ll@localhost ll@localhost‘s password: Last login: Sun Mar 6 10:50:06 2016 from localhost Could not chdir to home directory /home/ll: No such file or directory $ echo ‘hello world‘ sleep 5 hello world $ $
最后的exit让我去掉了、那么最终不会退出
将把交互交给用户、就是这样、不过基本用不上
还有一件事、就是我是做测试用、并没有写太多
最好就是加上timeout
set timeout 60
这个写在开头就可以
timeout的时间单位事秒
这就是今天所有的总结了、就这样
一般了解这么多就够了、其他的总结也没啥用,用bash就没问题了
本文出自 “Dashazi's blog” 博客,转载请与作者联系!
原文:http://dashazi.blog.51cto.com/10354524/1747788