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简介和使用例子的更多相关文章

  1. Linux Expect 简介和使用实例

    expect简介和使用实例 1 expect 简介 expect 是用来进行自动化控制和测试的工具. 主要是和交互式软件telnet ftp passwd fsck rlogin ssh tip 等进 ...

  2. 【DWR系列01】-DWR简介及入门例子

    .literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...

  3. liunx之expect简介

    导航: 一.expect安装.介绍.使用场景二.expect使用原理三.expect使用语法四.expect使用举例五.expect相关错误处理 - - - - - - - - - 分割线 - - - ...

  4. Shell系列(33) - 多分支if语句简介及计算器例子

    多分支if条件语句 if [ 条件判断式1 ] then 当条件判断式1成立时,执行程序1 elif [ 条件判断式2 ] then 当条件判断式2成立时,执行程序2 ...省略更多条件... els ...

  5. 3. Python 简介

    3. Python 简介 下面的例子中,输入和输出分别由大于号和句号提示符 ( >>> 和 ... ) 标注:如果想重现这些例子,就要在解释器的提示符后,输入 (提示符后面的) 那些 ...

  6. expect语法

    沙河西ftp上传,使用了expect语言的脚本. 我们经常会遇到一些需要与服务器程序打交道的场景,比如,从登陆某个服务器,然后进行某项工作.这很平常,但是如果把这个工作自动化进行,你就需要一个程序能自 ...

  7. Linux批量部署工具Expect

    既然没有遇到过,做好准备总是好的.这是自己送给自己的话,现在运维做自动话越来越多,自己就学以下,记录笔记.目前主流的有puppet.Expect.pssh等等,今天就用Expect做自动部署和日常管理 ...

  8. Linux使用expect实现免手动密码输入,linux免密码登陆

    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理.  脚本代码如下:  ###### ...

  9. Centos expect spawn、linux expect 用法

    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理.  脚本代码如下:  ###### ...

随机推荐

  1. flash插件如何生成

    1.通过flash 原生的代码开发插件界面: 2.对于需要使用到的文件,表现mxi 文件, 该文件为adobe extension infomation file, 示例如下 <macromed ...

  2. 斜率优化&单调性优化的相似性

    写了一道单调性优化发现 跟斜率优化很像,而且这道题目感觉质量非常的好. 其实斜率优化是基于单调性优化的,但是面对这道题 我竟然连单调性优化都不太会,尽管这个模型非常不好理解. 对于每道题 我都会打一个 ...

  3. 在VMware运行Linux下,密码错误的原因

    抱歉,没有奏效,请再试一次 密码明明是正确的,但依旧报错 原因: 密码中有大写,但键盘中的大写按键在登录界面无效,需要按住shift才能实现大写.

  4. python 反爬虫策略

    1.限制IP地址单位时间的访问次数 : 分析:没有哪个常人一秒钟内能访问相同网站5次,除非是程序访问,而有这种喜好的,就剩下搜索引擎爬虫和讨厌的采集器了. 弊端:一刀切,这同样会阻止搜索引擎对网站的收 ...

  5. swift 的相机扫描

    func scaning(){ //获取摄像设备 guard let device = AVCaptureDevice.default(for: .video) else { return } //输 ...

  6. Hibernate 和 MyBatis 的区别

    Hibernate 和 MyBatis 的增.删.查.改,对于业务逻辑层来说大同小异,对于映射层而言 Hibernate 的配置不需要接口和 SQL,相反 MyBatis 是需要的.对于 Hibern ...

  7. 前端 HTML form表单标签 select标签 option 下拉框

    <select></select> select里面通常跟option配合使用 <!DOCTYPE html> <html lang="en&quo ...

  8. 爬虫请求库——selenium

    selenium模块 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题.selenium的缺点是效率会变得很慢. sel ...

  9. vue中$set的用法

    数组: this.$set(Array,index, newValue) 对象: this.$set(Object, key, value)

  10. typedef 详解

    一行很常用的代码: typedef int XX_Size_Check[(sizeof(XX)==64)? 1:-1]; 很容易猜到上面这行代码是要在编译时检查XX的size,但再深究点,我们就会发现 ...