标签:backup yum 关闭 img 不可 ict ESS strong val
一、expect简介
Expect是一种TCL扩展性的语言,主要用于完成系统交互方面的功能,比如SSH、FTP等,这些程序都需要手工与它们进行互动,而使用Expect就可以模拟人手工互动的过程,是一种自动的方式控制。
在使用shell编写巡检脚本的过程中,常使用expect工具与巡检机器进行交互。通常我们在碰到交互逻辑无法往下进行的时候,这就需要使用到调试模式来具体分析。
二、安装
配置好yum后,安装命令如下
yum install expect
三、从一个简单的脚本开始
1 #!/usr/bin/expect -d 2 #writed by ahao 3 #注意,在spawn中,如果要注释的话,另外起一行,放在代码的后面会有问题,这点与bash不一样 4 set timeout 10 5 spawn -noecho ssh -o StrictHostKeyChecking=no -l test 192.168.2.151 -p 22 6 #spawn命令是expect的初始命令,他用于启动一个进程,之后所有操作都在这个进程中进行,如果没有spawn,这个expect都无法进行 7 #StrictHostKeyChecking=no参数让ssh默认添加新主机的公钥指纹,也就不会出现出现是否继续yes/no的提示了 8 expect "password:" {send "123456\r"} 9 expect "Last login" {send "echo test1\r"} #执行命令 10 expect "*\$*" {send "echo test2\r"} #执行命令 11 expect eof 12 #EOF(End Of File),表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin),EOF是不可输出字符,因此不能在屏幕上显示。由于字符的ASCII码不可能出现-1,因此EOF定义为-1是合适的。当读入的字符值等于EOF时,表示读入的已不是正常的字符而是文件结束符,但这适用对文本文件的读写 13 #也就是说eof通常定义为-1,在本文文件中数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~255,不可能出现-1,因此可以用EOF作为文件结束标志,如果处理时返回-1的值,那就eof
注:脚本中有4个expect过程
整个执行过程如下:1-3expect过程分别使用不同颜色标识
[patrol@report-server db_bin]$ ./auto_login.sh expect: does "" (spawn_id exp4) match glob pattern "password:"? no expect: does " " (spawn_id exp4) match glob pattern "Last login"? no
expect: does " \r\nLast login: Sun Nov 25 20:35:43 2018 from 192.168.2.150\r\r\n" (spawn_id exp4) match glob pattern "Last login"? yes expect: does ": Sun Nov 25 20:35:43 2018 from 192.168.2.150\r\r\n" (spawn_id exp4) match glob pattern "*$*"? no expect: does ": Sun Nov 25 20:35:43 2018 from 192.168.2.150\r\r\necho test1\r\n" (spawn_id exp4) match glob pattern "*$*"? no |
为了对比分析,把调试模式关闭,整个输出如下
[patrol@report-server db_bin]$ ./auto_login.sh |
四、过程分析
首先了解一下expect_out数组,expect_out数组专用与expect命令,里面的元素包括:
expect_out(buffer)、expect_out(X,string)、expect_out(X,start)、expect_out(X,end)、expect_out(spawn_id)
上面的X字符表示从0-9的整数,具体如下
结合上面的的第1个expect过程进行解析:
1 expect: does "" (spawn_id exp4) match glob pattern "password:"? no #不匹配,expect: does执行匹配动作,包括源字符串与需匹配的字符串,匹配是否成功,如果匹配成功,下面输出相关信息与动作,这里“ match glob pattern”匹配的是通配符表达式,如果使用正则表达式,会是类似如下输出:match regular expression ".*#"?,此时expect_out(buffer)为空 2 test@192.168.2.151‘s password: #输出 3 expect: does "test@192.168.2.151‘s password: " (spawn_id exp4) match glob pattern "password:"? yes #yes代表匹配 4 expect: set expect_out(0,string) "password:" #匹配到的字符串为”password” 5 expect: set expect_out(spawn_id) "exp4" #spawn_id进程为exp4 6 expect: set expect_out(buffer) "test@192.168.2.151‘s password:" #expect_out(buffer)变量的信息:test@192.168.2.151‘s password: 7 send: sending "123456\r" to { exp4 } #执行的动作,发送字符串到exp4
结合上面的第2个expect过程进行解析:
1 2 expect: does " \r\n" (spawn_id exp4) match glob pattern "Last login"? no #expect_out(buffer)变量为\r\n,在进行第2次expect的时候,expect_out(buffer)变量是不包含第一次匹配的字符串的 3 Last login: Sun Nov 25 20:35:43 2018 from 192.168.2.150 #上一个expect_send后的输出 4 5 expect: does " \r\nLast login: Sun Nov 25 20:35:43 2018 from 192.168.2.150\r\r\n" (spawn_id exp4) match glob pattern "Last login"? yes #匹配了,下面开始相关信息的输出与执行下一步的动作 6 expect: set expect_out(0,string) "Last login" #匹配到的字符串 7 expect: set expect_out(spawn_id) "exp4" 8 expect: set expect_out(buffer) " \r\nLast login" #expect_out(buffer)变量的值为“\r\nLast login” 9 send: sending "echo test1\r" to { exp4 } #发送命令到exp4
第3个expect分析:略
五、提一个问题
第二个expect和第三个expect顺序调转下,会是啥结果?如下代码:
1 #!/usr/bin/expect 2 #writed by ahao 3 #注意,在spawn中,如果要注释的话,另外起一行,放在代码的后面会有问题,这点与bash不一样 4 set timeout 10 5 spawn -noecho ssh -o StrictHostKeyChecking=no -l test 192.168.2.151 -p 22 6 #spawn命令是expect的初始命令,他用于启动一个进程,之后所有操作都在这个进程中进行,如果没有spawn,这个expect都无法进行 7 #StrictHostKeyChecking=no参数让ssh默认添加新主机的公钥指纹,也就不会出现出现是否继续yes/no的提示了 8 expect "password:" {send "123456\r"} 9 expect "*\$*" {send "echo test2\r"} 10 expect "Last login" {send "echo test1\r"} 11 expect eof 12 #EOF(End Of File),表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin),EOF是不可输出字符,因此不能在屏幕上显示。由于字符的ASCII码不可能出现-1,因此EOF定义为-1是合适的。当读入的字符值等于EOF时,表示读入的已不是正常的字符而是文件结束符,但这适用对文本文件的读写 13 #也就是说eof通常定义为-1,在本文文件中数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~255,不可能出现-1,因此可以用EOF作为文件结束标志,如果处理时返回-1的值,那就eof
结果就是:第三个expect不可能匹配成功, expect_out(buffer)变量已不可能包含关键字”Last login”
标签:backup yum 关闭 img 不可 ict ESS strong val
原文地址:https://www.cnblogs.com/fuqu/p/10017763.html