expect 自动完成交互式程序神器
expect 安装
yum -y install expect # Centos
sudo apt-get install expect # 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 | 将控制权交给终端,否则绘退出登陆 |
expect主要是在自动化登陆方面用的比较多,这里列举一个例子来说明expect的用途
在账号密码提前写好,然后自动的ssh登陆服务器,通过expect脚本就可以实现
文件名:[login.exp]
#!/usr/bin/expect set host 192.168.1.2
set port
set user root
set pass yourPassWD spawn ssh $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 "echo login successfully\r" interact
执行测试
root@demon-PC:/project# expect login.exp
spawn ssh root@192.168.1.2 -p 22
root@192.168.1.2's password:
Last login: Thu Feb 8 22:41:31 2018 from 192.168.1.104
Welcome to Demon Server !
[root@demon ~]# cd /tmp
[root@demon tmp]# echo login successfully
login successfully
批量登陆处理服务器
expect支持从外部传入参数,然后进行处理,通过if语句判断参数个数,来选择ssh登陆的类型
1.密码登陆 (4个参数)
2.密钥登陆 需指明密钥文件路径(5个参数)
将账号密码写入到一个文件里头
文件名:[loginfile]
192.168.1.2 root
192.168.1.3 root
192.168.1.4 root keyPass /root/.ssh/id_rsa
通过awk读取文件,将其作为参数传给expect
文件名:[login.sh]
#!/bin/bash
#@Author:Demon
awk '
{
host = $;
port = $;
user = $;
pass = $;
if($)system("expect /tmp/ssh.exp "host" "port" "user" "pass" "$);
else system("expect /tmp/ssh.exp "host" "port" "user" "pass);
}' loginfile
expect接收参数,并进行ssh登陆
文件名:[ssh.exp]
!/usr/bin/expect
#@Author:Demon
# How to use?
# ssh.exp 192.168.1.2 root youSSHPassWd
# ssh.exp 192.168.1.2 root youKeyPassWd /path/to/RSA.rsa #MUST
set REMOTE_HOST [lindex $argv ]
set REMOTE_PORT [lindex $argv ]
set REMOTE_USER [lindex $argv ]
set REMOTE_PASS [lindex $argv ]
set REMOTE_RSA [lindex $argv ] set TIMEOUT if { "$argc" == "" } { spawn ssh $REMOTE_USER@$REMOTE_HOST -p $REMOTE_PORT expect {
"yes/no" {send "yes\r";exp_continue} #first ssh login banner
"password:" {send "$REMOTE_PASS\r"} eof
"password:" {send "$REMOTE_PASS\r"} eof
"Permission denied" {spawn echo "need the path to rsa file"} #if no path to RSA file
} } elseif { "$argc" == "" } { spawn ssh $REMOTE_USER@$REMOTE_HOST -p $REMOTE_PORT -i "$REMOTE_RSA" expect {
"yes/no" {send "yes\r";exp_continue} #first ssh login banner
"Enter passphrase for key" {send "$REMOTE_PASS\r"}
eof
"Enter passphrase for key" {send "$REMOTE_PASS\r"}
}
} else { spawn echo "Too few Parameters"
spawn echo "How to use?"
spawn echo "ssh.exp 192.168.1.2 22 root youSshPassWd"
spawn echo "ssh.exp 192.168.1.2 22 root youKeyPassWd /path/to/RSA.rsa"
} #do some thing in remote server
expect "$REMOTE_USER"
send "mkdir -p /tmp/hello\r"
send "cd /tmp/hello\r"
send "touch Hello World Demon ComeHere\r"
# Written by Demon
最后执行bash login.sh就可以批量处理了
转载请指明:http://www.cnblogs.com/demonxian3/p/8433637.html
推荐学习网址:https://www.waitig.com/linux-expect-command-for-while-and-if-else.html
expect 自动完成交互式程序神器的更多相关文章
- Linux expect自动登录ssh,ftp
[http://blog.51yip.com/linux/1462.html#] #!/usr/bin/expect -f set ip 192.168.1.201 set password meim ...
- centos shell编程4【分发系统】 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要同步的文件 expect文件分发系统 expect自动发送密钥脚本 Linux脚本执行方式 第三十八节课
centos shell编程4[分发系统] 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要 ...
- linux 的 expect 自动交互
https://www.jianshu.com/p/0194cbd70d39 https://www.cnblogs.com/saneri/p/10819348.html 参考 expect是一个自 ...
- shell脚本--expect自动应答
expect自动应答 TCL语言 需求1:远程登录到A主机,什么事情也不做 #! /usr/bin/env expect # 开启一个程序 spawn ssh root@192.144.213.11 ...
- WPF:自动执行"机器人"程序若干注意事项
企业应用中,经常会遇到一些需要定时自动执行的程序来完成某些功能,比如:自动定时从第三方web service取回数据.定时对历史数据进行清理.定时向ftp上传业务数据... 这类程序,我习惯称为“机器 ...
- c#自动更新+安装程序的制作 (转)
c#自动更新+安装程序的制作 (转) http://blog.csdn.net/myhuli120/article/details/6927588 一.自动更新的实现 让客户端实现自动更新,通常做法 ...
- SSH批量管理 expect自动交互
SSH批量管理 expect自动交互 原创博文http://www.cnblogs.com/elvi/p/7662908.html # SSH批量管理 # expect自动交互 ########### ...
- 版本控制—使用Gradle自动管理应用程序版本
我们在开发App时,通常在项目的Release阶段我们需要设置应用的版本号和版本名称,也就是设置下面两个属性 versionCode versionName 版本号 其中versionCode的值是i ...
- java testng框架的windows自动化-自动运行testng程序上篇
本文旨在让读者简单了解testng的自动运行 怎么说呢,在网上已经有了各个前辈进行代码演示以及分享,我力争说到点子上 接上文,之前讲的大部分是juint的自动化代码运行,从未涉及到testng,但是在 ...
随机推荐
- CentOS配置Tomcat开机启动
通常我们进行服务器维护的时候需要注意点为,服务器上的容器一般都是开机启动,减少停机后应用还需要一个一个启动的麻烦. 1) 新建tomcat文件 touch /etc/rc.d/init.d/tomca ...
- @Transactional(rollbackFor = Exception.class)
@Transactional(rollbackFor = Exception.class)这个注解只有在出异常时才会回滚,需要回滚时没有异常也要人为制造异常(自定义异常)所以,如果使用了异常捕获,很有 ...
- [IR] Suffix Trees and Suffix Arrays
前缀树 匹配前缀字符串是不言自明的道理. 1. 字符串的快速检索 2. 最长公共前缀(LCP) 等等 树的压缩 后缀树 Let s=abab, a suffix tree of s is a comp ...
- 05原型模式Prototype
一.什么是原型模式 Prototype模式是一种对象创建型模式,它采 取复制原型对象的方法来创建对象的实例.使用 Prototype模式创建的实例,具有与原型一样的 数据. 二.原型模式的特点 1. ...
- Android 集成ShareSDK分享QQ或空间成功后,回调却不执行的原因
AndroidMainifest.xml中的如箭头所示的id一定要与assets下ShareSDK.xml中配置的QQ的AppId一定要相同. 如下图
- 微信小游戏的本地缓存和清除的使用 (text.js image.js file-util.js)
参考: 微信小游戏,文件系统 UpdateManager-小游戏 一.Egret提供的本地缓存工具类( 备注:新版本进行了修改,并增加了sound.js等) 在微信小游戏项目中,Egret提供了fil ...
- objective-c启用ARC时的内存管理 (循环引用)
PDF版下载:http://download.csdn.net/detail/cuibo1123/7443125 在Objective-C中,内存的引用计数一直是一个让人比较头疼的问 ...
- RMQ算法详解
RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n)),查询O(1),所以是一个很快速的算法. 当然这个问题用线段树同样能够解决,算法复杂度为:O(N)~O(logN) . ...
- stm32 硬件错误
进入该模式,程序死机. 一般来说都是内存错误 1. 数组越界,装入数据溢出, 2. 堆和栈设置不当,这里面硬件的堆和栈在汇编文件中,如果有freertos等,重点检查,任务堆栈使用情况,一般任务堆栈溢 ...
- SQL Server 查询数据库中被锁定的表
在一次测试过程中,发现有些表一直被锁定,从网上搜集了下资料,可以使用一下语句查看数据库中那些表正被锁定: select request_session_id spid,OBJECT_NAME(reso ...