博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Liunx expect 基础
阅读量:5147 次
发布时间:2019-06-13

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

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/expectset timeout 60set remote_host [lindex $argv 0]set type [lindex $argv 1]set target "output-0"set invalid "output-1"spawn ssh -o "no" $remote_hostset 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

转载于:https://www.cnblogs.com/xingzheanan/p/10295253.html

你可能感兴趣的文章
财务结算的目的和一般流程
查看>>
Myeclipse 优化1
查看>>
[BJOI2012]最多的方案(记忆化搜索)
查看>>
生成了一个严重警告并将其发送到远程终结点。这会导致连接终止。TLS 协议所定义的严重错误代码是...
查看>>
判断字符串是否为空的注意事项
查看>>
布兰诗歌
查看>>
vscode 中 eslint 相关配置
查看>>
老李分享:5个衡量软件质量的标准
查看>>
Xcode部分插件无法使用识别的问题
查看>>
set学习记录
查看>>
用函数写注册功能
查看>>
JVM笔记4:Java内存分配策略
查看>>
IE8 window.open 不支持此接口 的问题解决
查看>>
Django -- 发送HTML格式的邮件
查看>>
最近面试问题汇总
查看>>
ORM版学员管理系统3
查看>>
修改安卓虚拟机系统镜像
查看>>
windows 2003 Server平台Delphi程序不支持直接调用webservice
查看>>
电子书下载:Professional ASP.NET Design Patterns
查看>>
random 产生一个随机数的方法
查看>>