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. Typescript 最佳实践

    文章列表: <一>大话 TypeScript 基本类型 <二>大话 Typescript 枚举 <三>大话 Typescript 接口 <四>大话 Ty ...

  2. The first day of Crawler learning

    使用BeautifulSoup解析网页 Soup = BeautifulSoup(urlopen(html),'lxml') Soup为汤,html为食材,lxml为菜谱 from bs4 impor ...

  3. 高阶函数HOF和高阶组件HOC(Higher Order Func/Comp)

    一.什么是高阶函数(组件),作用是什么? 子类使用父类的方法可以通过继承的方式实现,那无关联组件通信(redux).父类使用子类方法(反向继承)呢 为了解决类(函数)功能交叉/功能复用等问题,通过传入 ...

  4. 共识网络BFT-SMaRt:理论与实践

    目录 BFT-SMaRt 简介 分布式计数器服务 功能描述 组网配置 启动节点 常见问题 计数服务 容错服务 BFT-SMaRt 理论 BFT-SMR 典型模式 SMR 状态机复制 VP-Consen ...

  5. vue-cli3 中 sockjs-node/info?t=报错 的解决方法

    页面突然出现这种报错: 查看Network看到是info接口报错,我项目中没有调用过该项目,然后百度查询sockjs-node/info?t=1562204191563, 首先 sockjs-node ...

  6. Eclipse中安装LEAP插件

    点击eclipse中顶部菜单栏中 Help 项,选择 Install New Software... 项 在弹出安装窗口中点击 Add... 在弹出的添加安装软件的窗口中点击 Local... 选择插 ...

  7. wpf 画五角星函数

    public void ABC() { var canvas = new Canvas(); Content = canvas; var points = new List<Point>( ...

  8. AcWing 244. 谜一样的牛|树状数组

    传送门 题目描述 有n头奶牛,已知它们的身高为 1~n 且各不相同,但不知道每头奶牛的具体身高. 现在这n头奶牛站成一列,已知第i头牛前面有Ai头牛比它低,求每头奶牛的身高. 输入格式 第1行:输入整 ...

  9. 【转】Twitter算法面试题详解(Java实现)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://androidguy.blog.51cto.com/974126/1319659 ...

  10. 【转】13个JavaScript图表(JS图表)图形绘制插件

    现在网络上又有越来越多的免费的(JS 图表)JavaScript图表图形绘制插件.我之前给一家网站做过复杂的图形,我们用的是 highchart.在那段时间,没有很多可供选择的插件.但现在不同了,很容 ...