#################################################

a script for study except

#################################################

#!/usr/bin/expect

声明文件内的语法使用 expect 的语法来执行。

send

send: 向进程发送字符串,用于模拟用户的输入。注意要加 \n 回车

expect

expect: 从 shell 进程接收字符串, " " 表示提示框里面的内容

expect {},多行期望,匹配到哪条执行哪条

spawn

spawn: 启动进程(由spawn启动的进程的输出可以被expect所捕获)。

spawn ssh $user@10.10.10.10

spawn启动一个进程,进程执行ssh命令,程序后面可以通过expect/send和新起的进程进行交互。

set 变量赋值

set timeout 60: 设置相应的时间,如果脚本执行或者网络问题超过了这个时间将不执行

set user "arlen"

set 嵌套命令

set user [lindex $argv 0]
set password [lindex $argv 1]

把命令行第一个参数赋给 user,第二个参数赋给 password 。

puts 输入输出

puts stderr "Usage: $argv0 login passwaord.n "
puts "hello world"
puts stdout "1234"

命令行参数

$argc,$argv 0,$argv 1 ... $argv n

argc表示命令行参数个数,后面分别表示各个参数项,0表示第一个参数,1表示第二个参数,以此类推,可以通过lindex获取对应参数值(lindex $argv 0)。

llength argv 表示参数的个数, argv0 表示脚本的名称

if

if 判断需要用 {} 括起来, 并且与 {} 之间需要有空格。

else / elseif 不能单独放一行,所以 else / elseif 要跟在 } 后面。

两个花括号之间必须有空格隔开,比如if {} {}。

使用{来衔接下一行,所以if的条件后需要加左花括号{ 。

grep

grep 到指定字符 $? 返回 0, grep 不到指定字符 $? 返回 1 。

函数定义和调用

proc do_console_login {login pass} { 

}

do_console_login $user $password

循环

while ($done) { 

}

条件分支 switch

switch -- $var { 

0 {

  } 

 1 { 

  } 

  2 { 

  } 

 }

示例:

#!/usr/bin/expect

set timeout 60
set remote_host [lindex $argv 0]
set type [lindex $argv 1]
set target "output-0"
set invalid "output-1" spawn ssh -o "no" $remote_host
set chan [open ansible.log a]
expect {
"$ " {
send "sudo systemctl status ***.service | grep 'active (running)' >&null; echo output-\$?\n"
}
timeout {
puts "could not connect to $remote_host!"
exit 1
}
}
expect {
"*output-0*" {
puts $chan "***.service is ok"
}
"*output-1*" { puts "***.service is inactive!!!"
send "exit"
exit 1
}
timeout { puts "***.service service status is wrong(Timeout)!"
send "exit"
exit 1
}
} if { "$type" == "***" } {
send "sudo systemctl status ***.service | grep 'active (running)' >&null; echo output-\$?\n"
expect {
"*output-0*" {
puts $chan "$type ***.service is ok !\n"
}
"output-1" {
puts "$type ***.service is wrong !\n"
exit 1
}
timeout {
puts "$type status is wrong(Timeout) !\n"
exit 1
}
}
} elseif { "$type" == "***" } {
send "sudo systemctl status ***.service | grep 'active (running)' >&null; echo output-\$?\n"
expect {
"*output-0*" {
puts $chan "$type ***.service is ok !\n"
}
"output-1" {
puts "$type ***.service is wrong !\n"
exit 1
}
timeout {
puts "$type status is wrong(Timeout) !\n"
exit 1
}
}
} else {
puts "it is not in these types"
exit 1
}
puts $chan "$type check service is done!!!"
exit 0

参考文章:

linux下expect使用教程: http://www.cnblogs.com/arlenhou/p/learn_expect.html

Liunx expect 基础的更多相关文章

  1. expect基础及实例

    expect基础及实例 http://blog.csdn.net/zhuying_linux/article/details/6900805

  2. Liunx之基础学习

    用户提权命令之-sudo sudo命令用来以其他身份来执行命令,预设的身份为root.在/etc/sudoers中设置了可执行sudo指令的用户.若其未经授权的用户企图使用sudo,则会发出警告的邮件 ...

  3. Liunx Shell入门

    本人也是初学习Liunx,如有错误请指出.Liunx版本:Ubuntu 14.04 一.Liunx命令基础 在Ubuntu下打开终端快捷键为:ctrl+Alt+T Liunx命令的基本格式:comma ...

  4. expect简介和使用例子

    expect简介和使用例子   expect简介 expect是一款自动化的脚本解释型的工具. expect基于tcl脚本,expect脚本的运行需要tcl的支持. expect对一些需要交互输入的命 ...

  5. Linux expect详解

    随处可见的expect第一次见expect这个命令还是我第一次参加全量上线的时候,那是公司的一个牛人用Shell脚本写的一套自动部署.MD5 比对.发布的全量上线工具,没事的时候,看了下其中的几个脚本 ...

  6. expect脚本远程登录、远程执行命令和脚本传参简单用法

    expect介绍: 最近想写一个自动化安装脚本,涉及到远程登录.分发文件包.远程执行命令等,其中少不了来回输入登录密码,交互式输入命令等,这样就大大降低了效率,那么有什么方法能解决呢?不妨试试expe ...

  7. Linux下的expect

    expect简介 expect是一款自动化的脚本解释型的工具. expect基于tcl脚本,expect脚本的运行需要tcl的支持. expect对一些需要交互输入的命令很有帮助,比如ssh ftp ...

  8. 000_linux之Ubuntu安装

    今天2018/6/1 今天是六一儿童节,天气凉爽,心情挺好的.然后本着开开心心的心情,将前面忘记写linux的Ubuntu没安装的写一下,以后自己回来看就很方便了.使用的是白问网制作的ubuntu,假 ...

  9. 很有用的shell脚本

    基础知识 expect基础知识 exp_continue是匹配一行后,从当前expect块第一行开始匹配 expect块的每一行匹配后,直接退出当前expect块,往下一个expect块开始匹配 ex ...

随机推荐

  1. Intellij IDEA 2018.2.2 SpringBoot热启动 (Maven)

    一.IDEA 工具配置 1. 打开IDEA 设置界面,选择编译,按图打勾. 2 . 然后 Shift+Ctrl+Alt+/,选择Registry 3 . compiler.automake.allow ...

  2. CCF认证201809-2买菜

    问题描述 小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁边的一个广场把菜装上车,两人都要买n种菜,所以也都要装n次车.具体的,对于小H来说有n个不相交的时间段 ...

  3. vue中通过定义的数组循环将img的src引入图片却不显示图片问题解决方法

    需要前端循环图片数组将其放到页面中去. 需要将src渲染到页面中,如果单纯写src的路径会出现不显示图片的问题 因为图片路径在assets,所以需要require一下.

  4. What to do next to activate this settings for already existing users

    Link: http://sharepoint.stackexchange.com/questions/89284/sharepoint-2013-mysite-increase-quota Cent ...

  5. uboot中ftd命令

    可以从u-boot官网源码下载一个比较新的u-boot, 查看它的cmd/fdt.cftp://ftp.denx.de/pub/u-boot/ fdt命令使用示例nand read.jffs2 320 ...

  6. [转载]Linux crontab命令解析

    名称 : crontab crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表.-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权 ...

  7. Java并发编程(九)线程间协作(下)

    上篇我们讲了使用wait()和notify()使线程间实现合作,这种方式很直接也很灵活,但是使用之前需要获取对象的锁,notify()调用的次数如果小于等待线程的数量就会导致有的线程会一直等待下去.这 ...

  8. JavaIO流(输入输出操作)

    Java中执行输出和输入操作,需要通过IO流.例如最常见的System.out.println()就是一个输出流.IO流的类比较多,但核心体系就是由File. InputStream .OutputS ...

  9. react-router里使用history

    import React, { Component } from 'react';import {Router, Route, Switch} from 'react-router-dom';impo ...

  10. less的编译

    less其实也文本类型,跟txt的性质差不多 less有自己语法(变量,函数,作用域.Mixin混入),使css样式更加方便,有逻辑性,提高可维护性,减少重复性代码的冗余. 把less编译成css文件 ...