expect简介

  • expect是一款自动化的脚本解释型的工具。

  • expect基于tcl脚本,expect脚本的运行需要tcl的支持。

  • expect对一些需要交互输入的命令很有帮助,比如ssh ftp scp telnet。远程登录linux服务器的时候,ssh命令需要手工输入密码,当登录多台机器的时候就会非常繁琐。expect就可以根据设定的规则,自动帮我们输入密码,大大节省了时间。

expect安装

sh-4.2# yum install expect
# 首先需要配置yum源,linux大部分iso里面都带有expect的包和依赖插件

expect基础知识

  1. expect脚本一般以#!/usr/bin/expect -f开头,类似bash脚本。
  2. 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
expect "*assword:" { send "$password\r" }
# 当输出中匹配*assword:时,输出password变量的数值和回车。

多分支模式语法

set password
expect {
"(yes/no)?" { send "yes\r"; exp_continue }
"*assword:" { send "$password\r" }
}
# 当输出中包含(yes/no)?时,输出yes和回车,同时重新执行此多分支语句。
# 当输出中匹配*assword:时,输出password变量的数值和回车。

expect实例详细讲解

ssh远程登录expect脚本

# 先建立login.exp
touch login.exp
chmod +x login.exp
vim login.exp
# 内容如下:
#!/usr/bin/expect -f
set timeout - //永远等待,不会超时
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 ;
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 ]    //第一个参数赋值给变量ip
set password [lindex $argv ] //第二个参数复制给变量password
set timeout -
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

文章来自转载:https://www.cnblogs.com/iops/p/expect-tutorial-and-example.html

Linux下的expect的更多相关文章

  1. Linux下利用expect,不用交互模式,直接登陆远程主机

    Linux环境下只有在机器20.200.254.18上ssh dataconv@20.200.31.23才能连接到23的机器,而且还需要输入密码(每次都需要输入地址,密码很烦),所以利用expect写 ...

  2. Linux下使用expect实现跳板机自动跳转/免密登录/自动登录(转)

    shell脚本实现ssh自动登录远程服务器示例: #!/usr/bin/expect spawn ssh root@192.168.22.194 expect "*password:&quo ...

  3. linux下expect使用教程

    一.expect介绍 Expect是Unix系统中用来进行自动化控制和测试的软件工具,由DonLibes制作,作为Tcl脚本语言的一个扩展,应用在交互式软件中如telnet,ftp,Passwd,fs ...

  4. Linux 下 expect 脚本语言中交互处理常用命令

    Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...

  5. 用了一天的时间,linux下expect实现ssh自动登录服务器记,鄙视下网上各种抄来抄去残段子

    因为要对客户方的快30个项目进行特别有顺序的重启,所以不得不想办法写个脚本,网上看了不少段子.真是残缺的可以.没有一段是可以正常运行的.我来按顺序记录一下 脚本的本身 使用expect实现自动登录的脚 ...

  6. 用了一天的时间,linux下expect实现ssh自己主动登录server记,歧视下网上各种抄来抄去残段子

    由于要对客户方的快30个项目进行特别有顺序的重新启动,所以不得不想办法写个脚本,网上看了不少段子.真是残缺的能够. 没有一段是能够正常运行的.我来按顺序记录一下 脚本的本身 使用expect实现自己主 ...

  7. Linux下 expect 使用详解与实例

    一.概述 我们通过Shell可以实现简单的控制流功能,如:循环.判断等.但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能.而Expec ...

  8. Linux下用ftp更新web内容!

    使用ftp更新web!让网页更新一次OK! 配置如下: 1.在Linux下安装ftp服务器! yum -y install vsftpd #ftp由vsftpd提供! 2.配置主配置文件/etc/vs ...

  9. [转] 关于linux下通过shell命令(自动)修改用户密码

    关于linux下通过shell命令(自动)修改用户密码 2012-04-23 18:47:39 分类: 原文地址:关于linux下(自动)修改用户密码 作者:ubuntuer 本文章总结了如何手动.自 ...

随机推荐

  1. 解决css布局时两个div一个宽度固定另一个占满剩余宽度的问题

    /*左侧div*/ .left-div{width: 220px;height: 100%;position: fixed;background: #FFFFFF;} /*右侧div*/ .right ...

  2. 解决Coursera视频无法观看的三种方法(亲测有效)

      ​   最近在coursera上课时出现了视频黑屏,网页缓冲,无法观看等问题,经过查询发现很多人也有同样的问题.对于不同的原因,一般来说解决方法也不同.这里有三种办法,大家可以挨个尝试,肯定有一个 ...

  3. socket粘包问题及解决方案

    一.粘包问题 问题1: 无法确认对方发送过来数据的大小. 'client.py' import socket client = socket.socket() client.connect( ('12 ...

  4. VC++取MD5算法记录下以后用得到(转)

    这个是网上扒下来的 作者已经无法知道是谁了 MD5.h #ifndef MD5_H #define MD5_H #include <string> #include <fstream ...

  5. 【题解】歌唱王国(概率生成函数+KMP)+伦讲的求方差

    [题解]歌唱王国(概率生成函数+KMP)+伦讲的求方差 生成函数的本质是什么呀!为什么和It-st一样神 设\(f_i\)表示填了\(i\)个时候停下来的概率,\(g_i\)是填了\(i\)个的时候不 ...

  6. 洛谷$P$2575 高手过招 博弈论

    正解:博弈论 解题报告: 传送门! 阿西$gql$又双叒被题意杀辣,,,再不好好学语文吃枣药丸$TT$ 然后在$get$规则之后还有什么问题嘛,,, 就和这题差不多了,一个$easy$的阶梯问题罢辽, ...

  7. 两个int数组对比,返回差异数据

    public static int[] DataDifference(int[] more, int[] few) { //差异Id var sbuNoItapSessionId = new int[ ...

  8. 漏洞挖掘 | 远程WWW服务支持TRACE请求

    允许TRACE方法 漏洞描述 目标WEB服务器启用了TRACE方法.TRACE方法是HTTP(超文本传输)协议定义的一种协议调试方法,该方法使得服务器原样返回任何客户端请求的内容(可能会附加路由中间的 ...

  9. 洛谷P5664 Emiya 家今天的饭 题解 动态规划

    首先来看一道题题: 安娜写宋词 题目背景 洛谷P5664 Emiya 家今天的饭[民间数据] 的简化版本. 题目描述 安娜准备去参加宋词大赛,她一共掌握 \(n\) 个 词牌名 ,并且她的宋词总共有 ...

  10. 1053 住房空置率 (20 分)C语言

    在不打扰居民的前提下,统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断.判断方法如下: 在观察期内,若存在超过一半的日子用电量低于某给定的阈值 e,则该住房为"可能空置&quo ...