一、同学们,你们有没有这样的想法,如何从机器A自动的ssh到机器B上,然后自动的执行机器B上的命令?如果你想实现这样的功能,请认真的阅读下面的内容。

二、Expect是一个用来处理交互的命令,借助Expect我们可以将交互过程写在一个脚本上,使之自动化完成。比如ssh登录,ftp登录,scp上传下载文件等都可以使用expect自动化处理。

Expect中最关键的四个命令是send,expect,spawn,interact。

send:用于向进程发送字符串

expect:从进程获取字符串

spawn:启动新的进程

interact:允许用户交互

1. send命令

描述:send命令接收一个字符串参数,并将该参数发送到进程

用法:

expect1.1> send "hello world\n"

hello world

2. expect命令

描述:expect命令和send命令正好相反,expect通常是用来等待一个进程的反馈,即获取标准输出的字符串,expect可以接收一个字符串参数,也可以接收正则表达式参数,和上文的send命令结合,现在我们可以看一个最简单的交互式的例子:

用法:

expect "hi\n"

send "hello there!\n"

这两行代码的意思是:从标准输出中获取hi后,向标准输入中输入hello there。

3. 模式-动作

expect最常用的语法是来自tcl语言的模式-动作。这种语法极其灵活,下面我们就各种语法分别说明。

3.1 单一分支模式语法:

expect "hi" {send "You said hi"}

匹配到hi后,会发送"you said hi"

3.2 多分支模式语法:

expect "hi" { send "You said hi\n" } \

"hello" { send "Hello yourself\n" } \

"bye" { send "That was unexpected\n" }

匹配到hi,hello,bye任意一个字符串时,执行相应的输出。等同于如下写法:

expect {

"hi" { send "You said hi\n"}

"hello" { send "Hello yourself\n"}

"bye" { send "That was unexpected\n"}

}

4. spawn命令

上文的所有demo都是和标准输入输出进行交互,但是我们希望可以和某一个进程进行交互。spawm命令就是用来启动新的进程的。spawn后的send和expect命令都是和spawn打开的进程进行交互的。结合上文的send和expect命令我们可以看一下更复杂的程序段了(test.expect)

#!/usr/bin/expect -f

set timeout -1 //不超时

spawn ftp ftp.test.com //打开新的进程,连接ftp服务器

expect "Name" //获取进程中 Name 这样的字符串

send "user\n" //向进程输入anonymous\n

expect "Password:" //进程返回Password:时

send "123456\n" //向进程输入don@libes.com\n

expect "ftp> " //进程返回ftp>时

send "binary\n" //向进程输入binary\n

expect "ftp> " //进程返回ftp>时

send "get test.tar.gz\n" //向进程输入get

test.tar.gz\n

然后执行:expect test.expect

这段代码的作用是登录到ftp服务器ftp.test.com上,并以二进制的方式下载服务器上的文件test.tar.gz

5.interact

到现在为止,我们已经可以结合spawn、expect、send自动化的完成很多任务了。但是如何让人在适当的时候干预这个过程了。比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令,interact可以达到这些目的,下面的demo在自动登录ftp后,允许用户交互(test1.expect)。

#!/usr/bin/expect -f

spawn ftp ftp.test.com

expect "Name"

send "user\r"

expect "Password:"

send "123456\r"

interact

执行:expect test1.expect

三、实例

用一段脚本实现了从机器A登录到机器B,然后执行机器B上的pwd命令,并停留在B机器上,等待用户交互(test2.expect)

#!/usr/bin/expect -f

spawn ssh -p220 test@201.101.20.58

expect "password" { send "abc1314\n"}

expect "\[test" { send "pwd\n"}

interact

执行:expect test2.expect

四、总结

如果你开发过windows的桌面程序,理解expect就更简单的,windows有一个专业名词叫模拟点击,其实这玩意我们可以叫他为模拟操作

比如:如果我们工程师操作连接一台服务器的话,步骤如下:

1,

【人工操作:】在shell中输入:ssh -p 220 test@201.101.20.58

然后回车

【代码操作:】spawn ssh -p220 test@201.101.20.58

2,

【人工操作:】回车后,这时我们会看到shell界面上提示一段英文字符串(test@201.101.20.58's

password:),然后我们输入密码,然后再回车。

【代码操作:】expect "password" { send "abc1314\n"},

分解代码操作:获取shell界面输出的字符串(标准输出),并在这个字符串中查找是否包含有password这样的字符串,【对应expect

"password"】

如果有password,那么我们就输入密码,然后回车, 【{ send "abc1314\n"}】

这里的\n就是回车,这里大家可以注意一下,expext是正则的方式查找的

3,

expect "\[test" { send "pwd\n"}

这句和上面的解释一样,但是需要注意的是,需要转义一下,因为expect是正则方式查找的

4,interact 当代码看到这句时,就停止执行了,并且人工可以操作。

四、正则表达式(expect可以接受正则表达式)

\ 转义,打开关闭后续特殊字符的含义。如\(...\)与\{...\}

linux命令模拟回车,linux之expect模拟操作相关推荐

  1. Linux命令篇 linux命令大全简洁明了 linux学习笔记

    Linux命令篇 linux命令大全简洁明了 linux学习笔记 Linux 命令大全 文章目录 Linux 命令大全 一. 常用的基础命令 查看目录: 切换目录: 创建和删除: 拷贝和移动文件: 查 ...

  2. 每天一个linux命令(25):linux文件属性详解

    每天一个linux命令(25):linux文件属性详解 Linux 文件或目录的属性主要包括:文件或目录的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容.具体情况如下 ...

  3. Linux命令集(Linux文件管理命令--rm指令篇)

    Linux命令集(Linux文件管理命令--rm指令篇) Linux文件管理命令集(rm指令篇) 3. rm(remove) 1. 删除文件 2. 强制删除文件 3. 提示确认,删除前需逐一询问是否确 ...

  4. Linux命令集(Linux文件管理命令--rmdir指令篇)

    Linux命令集(Linux文件管理命令--rmdir指令篇) Linux文件管理命令集(rmdir指令篇) 5. rmdir(remove directory) 1. 删除空的目录 folder1 ...

  5. linux 命令run road,linux命令进阶

    Though unconsciously,peple are indeed moving towards their destination.Slow as the progress seen fro ...

  6. 使用linux命令查看进程,Linux查看进程命令有哪些

    我们在使用Linux系统的过程中,有的时候会需要查看后台进程,并选择性的关闭一些不用的进程,那么Linux中有哪些查看进程的命令呢?今天小编就来为大家总结整理一些常用的Linux查看进程命令. Lin ...

  7. Linux命令集(Linux常用命令集--CD指令篇)

    Linux命令集(Linux常用命令--CD指令篇) Linux常用命令集(CD指令篇) 1.CD(change directory) Linux常用命令集(CD指令篇) 如下为笔者总结出在linux ...

  8. linux 命令传文件大小,Linux必学的60个命令(6)-其他

    Linux必学的重要命令 (1) 在前面几讲中,我们把Linux命令按照在系统中的作用分成几个部分分别予以介绍.但是,还有一些命令不好划分,然而学习它们同样是比较重要的. tar 1.作用 tar命令 ...

  9. linux 命令连接符,Linux 中命令链接操作符的十个最佳实例

    Linux 中命令链接操作符的十个最佳实例 日期:2017-12-14 浏览:1416次 评论:0条 侧边栏 英文:Tecmint,翻译:Linux中国/geekpi https://linux.cn ...

  10. 生成linux命令,详解Linux下随机生成密码的命令总结

    有时候经常为如何设置一个安全.符合密码复杂度的密码而绞尽脑汁,说实话,这实在是一个体力活而且浪费时间,更重要的是设置密码的时候经常纠结.终于有一天实在忍不住了,于是学习.整理了一下如何使用Linux下 ...

最新文章

  1. java计算程序运行时间_C#里面的时间,如何计算一个程序运行花费的时间
  2. 阿里云双十一1折,1C2G 1年仅99 !!一起来拼团!
  3. lightroom安卓_安卓可以用的一款PS
  4. 获取了网站源码有什么用_角点科技:用 Wordpress 建设企业网站需要准备些什么...
  5. Java中的XSL转换:一种简单的方法
  6. 横跨7个版本的OpenStack无感知热升级在360的落地与实践
  7. Intra Chroma Prediction
  8. 从 Google 代码库找到的好东西 [转]
  9. ManjarorLinux操作笔记
  10. 恒拓开源携开源中国有望于 10 月底挂牌新三板
  11. 苹果发信用卡——大数据解读硅谷巨头如何发力金融科技
  12. vue面试题+答案,2021前端面试
  13. 关于机器人创业:学术界vs工业界及中国机器人企业的机会
  14. word中字号与磅值(pt字体)的对应关系
  15. QT学习 实时显示时间
  16. java 快递_java模拟物流快递系统程序
  17. Eclipse更换护眼背景色——传说中的绿豆沙
  18. 小米基于OpenStack搭建私有云平台技术架构大揭秘!
  19. 2020年年度总结(致敬自己)
  20. UTF8 中文占几个字节

热门文章

  1. Keychron Q1:一把非常适合入门的客制化键盘
  2. js节点和元素区别【2021.11.10】
  3. 28元包邮奔腾二代CPU升级记
  4. 如何在公众号添加QQ链接
  5. go获取当天的第一秒和最后一秒的时间戳
  6. oracle蓝屏解决方法,遭遇蓝屏 (转)
  7. UNI-APP设置屏幕保持常亮
  8. xmind白屏崩溃文件没有保存怎么办 怎么找回xmind未保存的文件
  9. 最实用的家庭网络组网,小白也能了解家庭网络构成
  10. GoJS v2.2.2 去除水印方法