expect 自动完成交互式程序神器
2018-02-08 23:42
676 查看
expect安装
作用:自动填写交互式程序的值.
原理:通过读取交互式问题的关键字来判断具体执行什么操作
特性:
一个expect块负责一个交互问题,若expect块里的条件不匹配问题,则等待超时时间(timout),然后检测下一个expect块语句.
一个expect块里可以同时存在多个匹配关键字符串,若其中一个字符串匹配成功,执行完相应的操作后直接退出该
expect块,下一个交互式问题交给下一个expect块处理,不会再重新考虑expect块的其他条件
如果想在expect语句块里,某个条件命中后继续使用当前的expect块匹配处理下一个交互式问题,则需要在命中的
语句后面加上:exp_continue,但注意这容易产生死循环,请确保匹配字符串是唯一的
可以在expect语句块里面使用eof来实现条件逻辑或判断.
相关参数:
expect主要是在自动化登陆方面用的比较多,这里列举一个例子来说明expect的用途
在账号密码提前写好,然后自动的ssh登陆服务器,通过expect脚本就可以实现
文件名:[login.exp]
执行测试
root@demon-PC:/project#expectlogin.exp
spawnsshroot@192.168.1.2-p22
root@192.168.1.2'spassword:
Lastlogin:ThuFeb822:41:312018from192.168.1.104
WelcometoDemonServer!
[root@demon~]#cd/tmp
[root@demontmp]#echologinsuccessfully
loginsuccessfully
批量登陆处理服务器
expect支持从外部传入参数,然后进行处理,通过if语句判断参数个数,来选择ssh登陆的类型
1.密码登陆 (4个参数)
2.密钥登陆 需指明密钥文件路径(5个参数)
将账号密码写入到一个文件里头
文件名:[loginfile]
通过awk读取文件,将其作为参数传给expect
文件名:[login.sh]
expect接收参数,并进行ssh登陆
文件名:[ssh.exp]
最后执行bashlogin.sh就可以批量处理了
转载请指明:http://www.cnblogs.com/demonxian3/p/8433637.html
推荐学习网址:https://www.waitig.com/linux-expect-command-for-while-and-if-else.html
yum-yinstallexpect#Centos sudoapt-getinstallexpect#Ubuntu
作用:自动填写交互式程序的值.
原理:通过读取交互式问题的关键字来判断具体执行什么操作
特性:
一个expect块负责一个交互问题,若expect块里的条件不匹配问题,则等待超时时间(timout),然后检测下一个expect块语句.
一个expect块里可以同时存在多个匹配关键字符串,若其中一个字符串匹配成功,执行完相应的操作后直接退出该
expect块,下一个交互式问题交给下一个expect块处理,不会再重新考虑expect块的其他条件
如果想在expect语句块里,某个条件命中后继续使用当前的expect块匹配处理下一个交互式问题,则需要在命中的
语句后面加上:exp_continue,但注意这容易产生死循环,请确保匹配字符串是唯一的
可以在expect语句块里面使用eof来实现条件逻辑或判断.
相关参数:
timeout | 设置匹配等待的超时时间 |
spawn | 创建一个通道使得expect上下文中可以执行shell命令 |
expect | 设置期望值,即交互式问题中预期绘出现的关键字,及再匹配成功后采取相应的动作 |
send | 发送的字符串,比如输入登陆的账号密码,linux使用\r代表回车按键 |
set | 初始化变量 |
interact | 将控制权交给终端,否则绘退出登陆 |
在账号密码提前写好,然后自动的ssh登陆服务器,通过expect脚本就可以实现
文件名:[login.exp]
#!/usr/bin/expect sethost192.168.1.2 setport22 setuserroot setpassyourPassWD spawnssh$user@$host-p$port expect{ "yes/no"{send"yes\r"} "password:"{send"$pass\r"} eof "password:"{send"$pass\r"} } expect"$user@" send"cd/tmp\r" send"echologinsuccessfully\r" interact
执行测试
root@demon-PC:/project#expectlogin.exp
spawnsshroot@192.168.1.2-p22
root@192.168.1.2'spassword:
Lastlogin:ThuFeb822:41:312018from192.168.1.104
WelcometoDemonServer!
[root@demon~]#cd/tmp
[root@demontmp]#echologinsuccessfully
loginsuccessfully
批量登陆处理服务器
expect支持从外部传入参数,然后进行处理,通过if语句判断参数个数,来选择ssh登陆的类型
1.密码登陆 (4个参数)
2.密钥登陆 需指明密钥文件路径(5个参数)
将账号密码写入到一个文件里头
文件名:[loginfile]
192.168.1.222root123456 192.168.1.322root123123 192.168.1.422rootkeyPass/root/.ssh/id_rsa
通过awk读取文件,将其作为参数传给expect
文件名:[login.sh]
#!/bin/bash #@Author:Demon awk' { host=$1; port=$2; user=$3; pass=$4; if($5)system("expect/tmp/ssh.exp"host""port""user""pass""$5); elsesystem("expect/tmp/ssh.exp"host""port""user""pass); }'loginfile
expect接收参数,并进行ssh登陆
文件名:[ssh.exp]
!/usr/bin/expect
#@Author:Demon
#Howtouse? #ssh.exp192.168.1.222rootyouSSHPassWd #ssh.exp192.168.1.222rootyouKeyPassWd/path/to/RSA.rsa #MUST setREMOTE_HOST[lindex$argv0] setREMOTE_PORT[lindex$argv1] setREMOTE_USER[lindex$argv2] setREMOTE_PASS[lindex$argv3] setREMOTE_RSA[lindex$argv4] setTIMEOUT3 if{"$argc"=="4"}{ spawnssh$REMOTE_USER@$REMOTE_HOST-p$REMOTE_PORT expect{ "yes/no"{send"yes\r";exp_continue}#firstsshloginbanner "password:"{send"$REMOTE_PASS\r"} eof "password:"{send"$REMOTE_PASS\r"} eof "Permissiondenied"{spawnecho"needthepathtorsafile"}#ifnopathtoRSAfile } }elseif{"$argc"=="5"}{ spawnssh$REMOTE_USER@$REMOTE_HOST-p$REMOTE_PORT-i"$REMOTE_RSA" expect{ "yes/no"{send"yes\r";exp_continue}#firstsshloginbanner "Enterpassphraseforkey"{send"$REMOTE_PASS\r"} eof "Enterpassphraseforkey"{send"$REMOTE_PASS\r"} } }else{ spawnecho"ToofewParameters" spawnecho"Howtouse?" spawnecho"ssh.exp192.168.1.222rootyouSshPassWd" spawnecho"ssh.exp192.168.1.222rootyouKeyPassWd/path/to/RSA.rsa" } #dosomethinginremoteserver expect"$REMOTE_USER" send"mkdir-p/tmp/hello\r" send"cd/tmp/hello\r" send"touchHelloWorldDemonComeHere\r"
#WrittenbyDemon
最后执行bashlogin.sh就可以批量处理了
转载请指明:
推荐学习网址:
相关文章推荐
- shell中的expect软件(自动交互式程序)的使用
- 在校完成项目—————学生信息自动筛选程序
- 使用Oracle调度程序自动完成任务
- tomcat自动启动时无法调用交互式程序的问题
- android中程序更新下载完成后自动跳转安装界面
- VC++6.0 自动完成程序排版功能
- CoInitialize ( NULL )或其它启动代码。MFC程序使用AfxOleInit() 收回COM库。MFC 程序不用这一步,它自动完成。 CoUninitialize();
- 关于java程序实现自动选人系统 使用I/O流完成
- android中程序更新下载完成后自动跳转安装界面
- expect自动检测并重启另外一台服务器上的程序代码
- 7-2 一帮一(10 分) “一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名
- linux借助expect完成自动登录
- EditPlus编译运行C程序的示例2--配置模板和学会使用自动完成
- Linux下Expect 完成自动输入密码
- Linux下后台程序完成自动输入密码等交互行为的例子
- 浅谈使用expect实现自动交互式(2)
- 安卓程序升级自动安装,安装完成后提示是否打开程序(个人学习笔记)
- expect自动检测并重启另外一台服务器上的程序代码
- 浅谈使用expect实现自动交互式(1)
- Linux下后台程序完成自动输入密码等交互行为的例子