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. debian配置java环境变量

    操作如下 首先从Oracle上下载支持linux的java jdk,然后安装到你系统中, 然后到/home/xxxx/.bashrc文件中加入 # java JAVA_HOME=/xxx/xxxxx ...

  2. 【未完待续】API接口

    1.json传输 2.安全:权限  http://blog.csdn.net/linlzk/article/details/50748580. 比如:调用端有userId.psw.version.ti ...

  3. mysql学习【第2篇】:MySQL数据管理

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! mysql学习[第2篇]:MySQL数据管理 外键管理 外键概念 如果公共关键字在一个关系中是主 ...

  4. ini文件读写

    //创建对象:iniFile:=TIniFile.Create(strFile); //写入procedure IEAddFavUrl(FURL, Title: string);var  fPath: ...

  5. 洛谷P3193 [HNOI2008]GT考试 kmp+dp

    正解:kmp+dp+矩阵优化 解题报告: 传送门! 啊刚说想做矩阵优化dp的字符串题就找到辣QwQ虽然不是AC自动机的但都差不多嘛QwQ 首先显然可以想到一个dp式?就f[i][j]:凑出i位了,在s ...

  6. VS2013 opencv配置

    有三个地方需要配置,在配置之前首先要将platform配置好,下面的例子是x64 Release的“ 然后需要将include.lib的路径配置好 然后将dll拷贝至编译生成的Release文件夹中即 ...

  7. webpack导入css及各项loader

    1. webpack导入css 1) 下载相关的加载器 npm install style-loader css-loader -D 2)将index.css引入到mian.js中 import '. ...

  8. fdisk vs df

    fdisk工具是分区工具:df是用来查看文件系统(分区)的使用情况的! 当用来查看分区信息时,较为相似: fdisk侧重于显示分区表的信息: df侧重于显示当前系统中所有文件系统的信息: 常用用法: ...

  9. laravel用crud之index列出产品items

    前面我们说了laravel用crud修改产品items-新建resource controller和routing,现在我们要把产品items罗列出来,需要修改路由和模板,一起随ytakh来看看把 1 ...

  10. mysql 5.7配置项最详细的解释

    配置样例 首先提供一个我使用的配置样例 [client] #password=88888888 socket=/data/var/mysql/mysql.sock [mysqld_safe] pid- ...