expect简介和使用例子
expect简介和使用例子
expect简介
expect是一款自动化的脚本解释型的工具。
expect基于tcl脚本,expect脚本的运行需要tcl的支持。
expect对一些需要交互输入的命令很有帮助,比如ssh ftp scp telnet。
远程登录linux服务器的时候,ssh命令需要手工输入密码,当登录多台机器的时候就会非常繁琐。
expect就可以根据设定的规则,自动帮我们输入密码,大大节省了时间。
expect安装
一般机器不会自带expect,需要手动安装。
系统为RHEL/CentOS:
yum install expect
系统为Debian/Ubuntu:
apt-get install expect
expect基础知识
expect脚本
脚本开头
expect脚本一般以#!/usr/bin/expect -f开头,类似bash脚本。
常用后缀
expect脚本常常以.exp或者.ex结束。
expect主要命令
- spawn 新建一个进程,这个进程的交互由expect控制
- expect 等待接受进程返回的字符串,直到超时时间,根据规则决定下一步操作
- send 发送字符串给expect控制的进程
- set 设定变量为某个值
- exp_continue 重新执行expect命令分支
- [lindex $argv 0] 获取expect脚本的第1个参数
- [lindex $argv 1] 获取expect脚本的第2个参数
- set timeout -1 设置超时方式为永远等待
- set timeout 30 设置超时时间为30秒
- interact 将脚本的控制权交给用户,用户可继续输入命令
- expect eof 等待spawn进程结束后退出信号eof
expect命令分支
expect命令采用了tcl的模式-动作语法,此语法有以下几种模式:
单一分支语法
set password 123456
expect "*assword:" { send "$password\r" }
当输出中匹配*assword:时,输出password变量的数值和回车。
多分支模式语法
set password 123456
expect {
"(yes/no)?" { send "yes\r"; exp_continue }
"*assword:" { send "$password\r" }
}
当输出中包含(yes/no)?时,输出yes和回车,同时重新执行此多分支语句。
当输出中匹配*assword:时,输出password变量的数值和回车。
expect详细讲解
ssh远程登录expect脚本
下面是一个自动登录系统hostname1和hostname2执行uname -a后断开连接的脚本。
先建立login.exp
touch login.exp
chmod +x login.exp
vim login.exp
内容如下:
#!/usr/bin/expect -f
set timeout -1 //永远等待,不会超时
spawn ssh root@hostname1 //spawn 后面跟命令名称和参数
//如果匹配到*assword,那么发送密码,并进入下面的expect语句(uname -a语句)。
//如果匹配到yes/no,那么发送yes,并重新执行这个expect语句。
expect {
"*assword" {send "123456\r";}
"yes/no" {send "yes\r";exp_continue}
}
//匹配到*]#,那么运行uname -a命令
expect "*]#" {send "uname -a\r"}
send "exit\r" //退出远程登录
expect eof //结束spawn
//开始下一个命令
spawn ssh root@hostname2
expect {
"*assword" {send "123456\r";}
"yes/no" {send "yes\r";exp_continue}
}
expect "*]#" {send "uname -a\r"}
send "exit\r" //退出远程登录
expect eof //结束spawn
exit //退出expect脚本
ssh远程登录shell脚本(嵌套expect)
shell中使用expect -c "expect脚本内容"来完成嵌套。
注意:
expect脚本里面的"都需要在前面加上转义符号。
每个expect语句后面加上分号";"。
vim expect_in_shell.sh
#!/usr/bin/bash
HOSTS="hostname1 hostname2"
for host in $HOSTS
do
expect -c "
set timeout 5;
spawn ssh root@${host};
expect {
\"*assword\" { send \"123456\r\" }
\"yes/no\" { send \"yes\r\"; exp_continue }
} ;
expect \"*]#\" {send \"uname -a\r\" } ;
send \"exit\r\" //退出远程登录
expect eof
"
done
带参数的expect脚本ssh登录
vim login_arg.exp
#!/usr/bin/expect -f
set ip [lindex $argv 0] //第一个参数赋值给变量ip
set password [lindex $argv 1] //第二个参数复制给变量password
set timeout -1
spawn ssh root@$ip
expect {
"password" {send "$password\r";}
"yes/no" {send "yes\r";exp_continue}
}
interact //停留在远程shell
带参数运行login_arg.exp
chmod +x login_arg.exp
./login_arg.exp 127.0.0.1 123456
expect简介和使用例子的更多相关文章
- Linux Expect 简介和使用实例
expect简介和使用实例 1 expect 简介 expect 是用来进行自动化控制和测试的工具. 主要是和交互式软件telnet ftp passwd fsck rlogin ssh tip 等进 ...
- 【DWR系列01】-DWR简介及入门例子
.literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...
- liunx之expect简介
导航: 一.expect安装.介绍.使用场景二.expect使用原理三.expect使用语法四.expect使用举例五.expect相关错误处理 - - - - - - - - - 分割线 - - - ...
- Shell系列(33) - 多分支if语句简介及计算器例子
多分支if条件语句 if [ 条件判断式1 ] then 当条件判断式1成立时,执行程序1 elif [ 条件判断式2 ] then 当条件判断式2成立时,执行程序2 ...省略更多条件... els ...
- 3. Python 简介
3. Python 简介 下面的例子中,输入和输出分别由大于号和句号提示符 ( >>> 和 ... ) 标注:如果想重现这些例子,就要在解释器的提示符后,输入 (提示符后面的) 那些 ...
- expect语法
沙河西ftp上传,使用了expect语言的脚本. 我们经常会遇到一些需要与服务器程序打交道的场景,比如,从登陆某个服务器,然后进行某项工作.这很平常,但是如果把这个工作自动化进行,你就需要一个程序能自 ...
- Linux批量部署工具Expect
既然没有遇到过,做好准备总是好的.这是自己送给自己的话,现在运维做自动话越来越多,自己就学以下,记录笔记.目前主流的有puppet.Expect.pssh等等,今天就用Expect做自动部署和日常管理 ...
- Linux使用expect实现免手动密码输入,linux免密码登陆
使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理. 脚本代码如下: ###### ...
- Centos expect spawn、linux expect 用法
使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理. 脚本代码如下: ###### ...
随机推荐
- debian配置java环境变量
操作如下 首先从Oracle上下载支持linux的java jdk,然后安装到你系统中, 然后到/home/xxxx/.bashrc文件中加入 # java JAVA_HOME=/xxx/xxxxx ...
- 【未完待续】API接口
1.json传输 2.安全:权限 http://blog.csdn.net/linlzk/article/details/50748580. 比如:调用端有userId.psw.version.ti ...
- mysql学习【第2篇】:MySQL数据管理
狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! mysql学习[第2篇]:MySQL数据管理 外键管理 外键概念 如果公共关键字在一个关系中是主 ...
- ini文件读写
//创建对象:iniFile:=TIniFile.Create(strFile); //写入procedure IEAddFavUrl(FURL, Title: string);var fPath: ...
- 洛谷P3193 [HNOI2008]GT考试 kmp+dp
正解:kmp+dp+矩阵优化 解题报告: 传送门! 啊刚说想做矩阵优化dp的字符串题就找到辣QwQ虽然不是AC自动机的但都差不多嘛QwQ 首先显然可以想到一个dp式?就f[i][j]:凑出i位了,在s ...
- VS2013 opencv配置
有三个地方需要配置,在配置之前首先要将platform配置好,下面的例子是x64 Release的“ 然后需要将include.lib的路径配置好 然后将dll拷贝至编译生成的Release文件夹中即 ...
- webpack导入css及各项loader
1. webpack导入css 1) 下载相关的加载器 npm install style-loader css-loader -D 2)将index.css引入到mian.js中 import '. ...
- fdisk vs df
fdisk工具是分区工具:df是用来查看文件系统(分区)的使用情况的! 当用来查看分区信息时,较为相似: fdisk侧重于显示分区表的信息: df侧重于显示当前系统中所有文件系统的信息: 常用用法: ...
- laravel用crud之index列出产品items
前面我们说了laravel用crud修改产品items-新建resource controller和routing,现在我们要把产品items罗列出来,需要修改路由和模板,一起随ytakh来看看把 1 ...
- mysql 5.7配置项最详细的解释
配置样例 首先提供一个我使用的配置样例 [client] #password=88888888 socket=/data/var/mysql/mysql.sock [mysqld_safe] pid- ...