博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
expect实现命令行简单交互
阅读量:6313 次
发布时间:2019-06-22

本文共 1232 字,大约阅读时间需要 4 分钟。

hot3.png

在服务器开发中,有时候需要自动同步另一个服务器的一个文件,这时候就需要通过scp来把文件复制到当前服务器目录下,如:

scp -r -P 2214:lex@192.168.120.204:/data/user/user.profile  ./

scp需要认证用户名和密码,可以通过在对方服务器通过密钥对来验证不需要输入密码验证,但除了这个还有其他方法,能够实现在执行scp命令时,要求输入密码时能够自动输入密码吗?

linux提供了一个Expect的工具,Expect是Unix系统中用来进行自动化控制和测试的软件工具,由DonLibes制作,作为Tcl脚本语言的一个扩展,应用在交互式软件中如telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等。该工具利用Unix伪终端包装其子进程,允许任意程序通过终端接入进行自动化控制;也可利用Tk工具,将交互程序包装在X11的图形用户界面中。

简单地说,expect是一个工具,可以根据用户设定的规则和系统进程进行自动化交互,例如远程登陆的密码输入、自动化的执行远程命令。 expect的安装很简单,几个命令就搞定,具体谷歌(不是百度,程序员不要用百度)。 这是一个ssh自动登录的脚本:

#!/usr/bin/expectspawn ssh root@192.168.22.194expect "*password:"send "123\r"expect "*#"interact

以上代码有几个关键字,

  • send:用于向进程发送字符串
  • expect: 期望从进程接收到的字符串,后面也可以跟正则表达式
  • spawn:启动进程 第一行指定了该脚本的解释器,代码保存为ssh.exp 需要运行时输入./ssh.exp 即可。 很多时候,我们使用expect的场景都是结合bash在使用,expect只是作为bash脚本的部分调用,因为bash里我们还需要执行其他复杂的功能:
#!/usr/bin/bash ...expect<<- END scp -r -P 2214:lex@192.168.120.204:/data/user/user.profile  ./ expect "*password"send "password"expect eof END

将expect脚本嵌入expect<<- END 和END之间即可,expect eof是指等待脚本执行结束,这里如果scp,要传输的文件略大,会断掉,因为expect有个默认的超时时间,时间到了脚本会中断,可以通过:

set timeout -1 -- 没有timeout set timeout XX -- 设定具体的timeout时间(秒)

以上就是关于expect的简单使用,至于更高级的用法,需要的时候去搜索搜索就行了,都不难。

转载于:https://my.oschina.net/u/156466/blog/687468

你可能感兴趣的文章
转:【WebView的cookie机制 】轻松搞定WebView cookie同步问题
查看>>
PHP 依赖注入和控制反转再谈(二)
查看>>
es6 Map,Set 和 WeakMap,WeakSet
查看>>
实现UIScrollView循环滚动的三种方法
查看>>
WP7 开发(三) Isolate Storage(保存数据)
查看>>
WireShark(三)
查看>>
简朝阳:MySQL的B2C电商系统前端数据层架构
查看>>
12.8.1 Red Hat和Fedora的网络配置
查看>>
Oracle RAC 碰到 gc buffer busy
查看>>
Selenium2(WebDriver)总结(一)---启动浏览器、设置profile&加载插件
查看>>
struct2视频教程
查看>>
SPOJ 2798 Query on a tree again!
查看>>
利用URL重写实现参数目录化
查看>>
linux 判断文件最后更新时间 实现监控日志是否有输出功能
查看>>
爪哇国新游记之八----读写文件及数组排序
查看>>
应用解决告诉你什么时候该用ajax
查看>>
PAT A1015
查看>>
React-生命周期杂记
查看>>
十流程序员 编程 的小小想法
查看>>
设计模式(2)代理模式
查看>>