壳编程之期望免交互
一、前言
?shell脚本存在的核心意义就在于基于壳牌命令简化甚至省略可避免的人工操作,通过各种控制流程结构以及正则表达式等方法,逐步实现自动化操作的整个过程,由此也可见,shell并没有面向对象的思想,类似C语言,毕竟C语言是操作系统或者说是内核的核心语言。
?所以,语言并无优劣之分,只是每个人使用的习惯与方式不同,换句话说,难易的不是语言,而是思想与突如其来的灵感。
二,期望概述与安装
期待概述
?期望是建立在TCL基础上的一个工具,预计是用来进行自动化控制和测试的工具。主要解决shell脚本中不可交互的问题。对于大规模的Linux运维很有帮助。
?在Linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互过程,需要输入是/否密码等信息。为了模拟这种输入,可以使用期望脚本。
期待的安装:yum安装- y期望
三,基本命令
-
<李>
发送:向进程发送字符串,用于模拟用户的输入,但不支持换行一般需要加上\ r
李> <李>:内部命令
?判断上次输出结果里是否包含指定的字符串,有则返回,反之就等待超时时间后返回。
?只能捕捉由产卵启动的进程的输出。
李> <李>产卵:启动进程,并跟踪后续交互信息。
李> <李>互动:执行完成后保持交互状态,把控制权交给控制台。李>超时:指定超时时间,过期则继续执行后续指令
-
<李>单位是s 李>
<李>超时1为永不超时李>
<李>默认情况下超时是10 s 李>
exp_continue——允许希望继续向下执行指令(比较关键,多次交互)
send_user——回显命令,相当于回波
四,期望语法
期待[选项][- c cmds] [[- [f | b]] cmdfile] (args)
选项
- c:从命令行执行预计脚本,默认期望是交互地执行的
示例:期望- c的期望“\ n"{发送“按输入\ n"}
- d:可以输出输出调试信息
示例:期望- d ssh.exp
期待最常用的语法(tcl语言:模式,动作)
单一分支模式语法:
期待“嗨”{发送“你说嗨\ n"}匹配到你好后,会输出“你说嗨”,并换行,也可以使用\ r
多分支模式语法:
期待“hi"{发送“你说嗨\ n"}\“hehe"{发送“呵呵自己\ n"}\“bye"{发送“再见\ n"}
匹配你好,你好,再见任意字符串时,执行相应输出。等同如下:
预计{“hi"{发送“你说嗨\ n"}“hehe"{发送“呵呵自己\ n"}“bye"{发送“再见\ n"}}
五、实例:
1) ssh免交互远程登录
<代码类=" language-shell "> [root@lokott ~] # yum安装- y期望 已加载插件:fastestmirror langpacks 从缓存hostfile加载镜像速度 …//省略部分 #猫a.sh root@lokott壳 #使用,希望查看其位置 # !/usr/bin/期望 #设置超时时间 设置超时20 log_file test.log log_user 1 #变量定义 设置主机名lindex $ argv [0] 设置密码lindex $ argv [1] #启动进程,产卵监控 产卵ssh root@美元主机名 #匹配条件 预计{ “(yes/no)” # exp_continue表示继续向下匹配 {发送“是的\ r”; exp_continue} “*密码” {发送" $ passwd \ r "} } #转交权限给控制台 交互 (root@lokott shell) #。/h 192.168.68.129 123456//第一次登录 产卵ssh root@192.168.68.129 主机的真实性192.168.68.129(192.168.68.129)”不能成立。 指纹ECDSA关键是SHA256: k/6 w9m/dgxVrbMgSx9nIFPGfVgUfLMoIb27ys9ZF + LM。 指纹ECDSA关键是MD5:26: dd: 06: b3:32: bd: d6: a3:2f: 7 c: 66:7d: b9: c0:4b: c4。 你确定你要继续连接(是/否)?是的 警告:永久“192.168.68.129”(ECDSA)添加到已知的主机列表。 root@192.168.68.129的密码: 最后登录:2019年12月4日10:24:33从192.168.68.1结婚 root@localhost ~ #退出 登出 连接192.168.68.129关闭。 (root@lokott shell) #。/h 192.168.68.129 123456//第二次登录上一次登录需要的秘钥已经保存 产卵ssh root@192.168.68.129 root@192.168.68.129的密码: 最后登录:2019年12月4日10:29:42从192.168.68.130结婚 root@localhost ~ #退出 登出 连接192.168.68.129关闭。代码>
上述演示的是直接使用期望脚本实现ssh远程登录的操作过程,而期望脚本也可以被嵌入到普通的脚本文件中、下面给出具体演示: