在使用基本的一些shell命令时,机器需要与人进行互动来确定命令的执行。比如 cp test.txt boo/test.txt,会询问是否覆盖?ssh远程登陆时,需要输入人工密码后,才可以继续执行ssh命令等等。如何编写可以自动与shell交互的命令行,而不再需要人工介入呢?expect于此横空出世。

“Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年 开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件 (Expect [is a] software suite for automating interactive tools)。使用它系统管理员 的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。”

下面我们安装下expect,并做简单的测试,确保正确使用expect脚本。Expect需要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl。

expect下载地址

http://download.chinaunix.net/download/0003000/2845.shtml

tcl下载地址

http://download.chinaunix.net/download/0001000/22.shtml

1。先安装tcl

  进入tcl解压目录,然后进入unix目录

  #./configure

  #make

  #make install

2.后安装expect

  进入expect解压目录

  #./configure --with-tclinclude=/usr/src/tcl8.4.19/generic/ --with-tclconfig=/usr/local/lib/

  #make

  #make install

完成,测试

  #expect

  expect1.1>

  expect1.1>

一切OK,安装成功。

编写一个测试脚本,测试expect按正常运行。touch test.exp,文件以exp结尾或tcl结尾,都可以执行。注【spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命 令的。】

###author:usgrouping@weixin

#!/usr/local/bin/expect

set timeout 30

set password zhishi2016&*!db1

spawn ssh -l root 118.76.22.83 -p 14010

expect "*assword:" { send "$password\n"}

expect "*#"

send "echo success,we get into the remote directory!\r"

expect "100%"

expect eof

interact

保存后,运行expect test.exp,成功后输出:success,we get into the remote directory!

expect先介绍到这里,深入了解可翻阅网络相关资料。

上篇《利用jenkins实现自动构建、部署,提升团队开发效率》,自动构建后部署到应用服务器,是结合shell脚本完成的部署升级。环境是jenkins部署在内网,脚本执行也是内网。下篇内容将利用jenkins+shell+expect脚本的方式来部署线上环境,敬请关注......

【一位十年码农的碎碎念,扫码关注获取更多精彩内容】

原创文章,转载请注明出处,更多文章请关注公众号。

如何编写无须人工干预的shell脚本的更多相关文章

  1. 如何在linux下编写一个简单的Shell脚本程序

    在了解了linux终端和其搭配的基本Shell(默认为bash)的基础下,我们就可以在终端中用vi/vim编辑器编写一个shell的脚本程序了 Shell既为一种命令解释解释工具,又是一种脚本编程语言 ...

  2. 使用redis4.0.1和redis-cluster搭建集群并编写重启shell脚本

    1.删除机器上原有的redis2.8 关闭redis-server killall -9 redis-server 查找redis文件所在目录 which redis 删除相关文件 rm -rf re ...

  3. 使用C#给Linux写Shell脚本

    在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...

  4. shell脚本每天自动备份mysql数据库

    一.mysql提供了一个mysqldump的工具可以方便的导出导入数据库信息: 二.使用命令行shell测试执行mysqldump,理解必备的参数,查看生成的sql备份文件是否符合需求: /usr/b ...

  5. 将PHP作为Shell脚本语言使用

    我们都知道.PHP是一种非常好的动态网页开发语言(速度飞快.开发周期短--).可是仅仅有非常少数的人意识到PHP也能够非常好的作为编写Shell脚本的语言,当PHP作为编写Shell脚本的语言时,他并 ...

  6. 转 shell脚本学习指南

    shell脚本学习指南 以下八点不敢说就能成为你shell脚本学习指南de全部,至少可以让你编写出可靠的shell脚本. 1. 指定bashshell 脚本的第一行,#!之后应该是什么?如果拿这个问题 ...

  7. Java面试12|Linux及Shell脚本

    1. 随便写一个awk的命令.用awk统计文本行数 (1)最近登录的5个帐号 last -n 5 | awk -F ':'(指定域分割符号) '{print $1}' 读入有'\n'换行符分割的一条记 ...

  8. Linux Shell脚本编程

    ⒈为什么要学习Shell编程 1)Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理 2)对于JavaEE和Python程序员来说,有些工作需要编写一些Shell脚本进 ...

  9. 使用shell脚本来自动化处理我们的工作,解放双手

    Shell脚本介绍 1.Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. 2.Shell可以直接使用在wi ...

随机推荐

  1. Python写的嗅探器——Pyside,Scapy

    使用Python的Pyside和Scapy写的嗅探器原型,拥有基本框架,但是功能并不十分完善,供参考. import sys import time import binascii from PySi ...

  2. Qt PNG 背景透明

    本文主要是解决Qt中QGraphicsAbstractShapeItem,QPixmap,QPainter等组件的透明化显示问题. 在Qt中定义了一个常量,用于设置透明的颜色,即Qt::transpa ...

  3. 在DELPHI中*.wav 文件怎么加到资源文件中

    比较“流行”的说法是:“16位的Delphi   1.0和32位的Delphi2.0.3.0都提供了资源         编译工具,其中   Delphi   1.0的资源编译器叫BRCC.EXE,D ...

  4. 编解码TIFF图像

    解码: // Open a Stream and decode a TIFF image Stream imageStreamSource = new FileStream("tulipfa ...

  5. 【备忘】C#语言基础-1

    C#基础 注意区别哟! C#是一种托管语言,与C++不同,不能直接操作系统底层,依赖于 framework. 如果局部变量和全局变量同名,全局变量就会被屏蔽. 函数的返回值类型不是签名的一部分,所以不 ...

  6. DELPHI美化界面(2009开始TPanel增加了ParentBackGround)

    1.透明问题. 要重新调整界面确实很麻烦,以前用DELPHI开发的界面都很土,和WEB真是没办法比.(我以前用的是DELPHI7),现在回想起来,DELPHI难做的原因是:没有透明控件.所有控件都是不 ...

  7. 使用MSYS2环境中编译Qt5.5.0的补丁

    Qt的configure脚本对MinGW静态编译支持不太完善,总有这样那样的问题.如果你不嫌麻烦,而且可以接受高版本的Qt的话,可以考虑使用我做的补丁在MSYS2环境中编译.Qt5.4.2的补丁 Qt ...

  8. web开发常用正则表达式

    整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$".只能输入n位的数字:"^\d{n}$".只能输入至少n位的数 ...

  9. Linux中$的特殊用法

     一:变量说明:($表示在执行命令的一些参数)   (!)    $!      #Shell最后运行的后台Process的PID  (2)    $?      #最后运行的命令的结束代码(返回值) ...

  10. Nginx多种负载均衡策略搭建

    背景介绍 上篇介绍了利用Nginx反向代理实现负载均衡,本文详细讲述Nginx下的几种负载均衡策略. 轮询 轮询,顾名思义,就是轮流请求,基于上篇文章的介绍,我们将负载均衡策略聚焦于default.c ...