建站系统主要包括什么,东莞品牌设计公司,其中包括,在招聘网站做销售怎么样目录
❀expect命令运用于bash❀
expect使用原理
expet使用场景
常用的expect命令选项
Expect脚本的结尾
常用的expect命令选参数
Expect执行方式
单一分支语法
多分支模式语法第一种
多分支模式语法第二种
在shell 中嵌套expect
Shell Here Document#xff08;内…目录
❀expect命令运用于bash❀
expect使用原理
expet使用场景
常用的expect命令选项
Expect脚本的结尾
常用的expect命令选参数
Expect执行方式
单一分支语法
多分支模式语法第一种
多分支模式语法第二种
在shell 中嵌套expect
Shell Here Document内嵌文档/嵌入文档
Here Document 的基本用法
expect变量如何定义和调用
函数传参数给expect应该如何实现
用法说明
观点
利
弊 ❀expect命令运用于bash❀
功能说明expect是一款自动化的脚本解释型的工具。
(ps.expect基于tcl脚本expect脚本的运行需要tcl的支持。expect对一些需要交互输入的命令很有帮助,比如ssh ftp scp telnet。远程登录linux服务器的时候ssh命令需要手工输入密码当登录多台机器的时候就会非常繁琐。expect就可以根据设定的规则自动帮我们输入密码大大节省了时间。在shell脚本中使用expect命令可以实现自动化交互式操作例如自动登录远程服务器、自动执行命令等。)
expect使用原理
spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出。
expet使用场景
①并根据预定标准回答其问题回答“是”、“否”或将控制权交还给您
②远程连接设备并执行自动化操作
③主要是一些需要人机交互的地方如果提前知道应该输入什么指令都可以使用expect 工具
常用的expect命令选项
spawn启动一个新的进程并将其与当前进程进行交互。
expect等待特定的字符串或正则表达式出现并执行相应的操作。
send向进程发送字符串并将该参数发送到进程这个过程类似模拟人类输入密码。
interact允许用户与进程进行交互interact命令可以在适当的时候进行任务的干预比如下载完ftp文件时仍然可以停留在ftp命令行状态以便手动的执行后续命令。
exp_continue允许expect继续向下执行指令在expect中多次匹配就需要用到。
exit退出expect脚本。
eofexpect执行结束退出。
set设置变量。
puts输出变量。
Timeout指定超时时间set timeout n过期则继续执行后续指令 设置超时时间,表示该脚本代码需在n秒钟内完成如果超过则退出。timeout -1为永不超时用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住。默认情况下timeout是10秒。
send_user 回显命令相当于echo。
$argv参数数组Expect脚本可以接受从bash传递的参数可以使用[lindex $argc n]获得n从0开始分别表示第一个第二个第三个…参数。
arg参数 vvalue。
Expect脚本的结尾
expect脚本必须以interact或expect eof结束执行自动化任务通常expect eof就够了
expect eof是在等待结束标志。由spawn启动的命令在结束时会产生一个eof标记expect eof就是在等待这个标记。
常用的expect命令选参数
-c命令行执行expect脚本
-i交互地执行expect脚本。使用“-i”选项可以通过来自于标准输入的读命令来交互地执行expect脚本。
-ddebug模式可以在运行时输出一些诊断信息输出调试信息 。 示例expect -d ssh.exp
-D启用交换调式器,可设一整数参数
-f 从文件读取命令仅用于使用#!时。如果文件名为-则从stdin读取(使用./-从文件名为-的文件读取)
-v 显示expect版本信息
-b不解释命令行参数
Expect执行方式
单一分支语法
expect password: {send mypassword\r}
多分支模式语法第一种
expect aaa {send AAA\r}
expect bbb {send BBB\r}
expect ccc {send CCC\r}
ps.send命令不具备回车换行功能所以需要自己添加\r 或 \n
多分支模式语法第二种
expect {
aaa {send AAA\r}
bbb {send BBB\r}
ccc {send CCC\r}
}
#只要匹配了aaa 或bbb或ccc中的任何一个执行相应的send语句后就会退出该expect语句
expect {
aaa {send AAA\r;exp_continue}
bbb {send BBB\r;exp_continue}
ccc {send CCC\r}
}
#exp_continue表示继续后面的匹配如果匹配了aaa执行完send语句后还会继续向下匹配bbb
#捕捉内容要用双引号引起来
#send要写在{}中输出信息也要用双引号引起来分号“”要写在}里面。
在shell 中嵌套expect
#!/bin/bashuserroot
ip192.168.56.103
passwd123456expect -EOF
set time 30
spawn ssh $user$ip
expect {*yes/no { send yes\n; exp_continue }*password { send $passwd\n }
}
interact
EOF其中 -EOF 和 EOF 包围的内容块被重定向到左侧命令 expect 的 stdin 中。
Shell Here Document内嵌文档/嵌入文档
Shell 还有一种特殊形式的重定向叫做“Here Document”目前没有统一的翻译你可以将它理解为“嵌入文档”“内嵌文档”“立即文档”。
所谓文档就是命令需要处理的数据或者字符串所谓嵌入就是把数据和代码放在一起而不是分开存放比如将数据放在一个单独的文件中。有时候命令需要处理的数据量很小将它放在一个单独的文件中有点“大动干戈”不如直接放在代码中来得方便。
Here Document 的基本用法
command EOF
document
EOF
command是 Shell 命令EOF是开始标志EOF是结束标志document是输入的文档也就是一行一行的字符串。
这种写法告诉 Shell 把 document 部分作为命令需要处理的数据直到遇见终止符EOF为止终止符EOF不会被读取。
注意终止符EOF必须独占一行并且要定顶格写。
分界符终止符可以是任意的字符串由用户自己定义比如 END、MARKER等ABC也可以只要前后一致分界符可以出现在正常的数据流中只要它不是顶格写的独立的一行就不会被作为结束标志。
结尾的标记一定要顶格写前面不能有任何字符除了空格 结尾的标记后面也不能有任何字符包括空格
expect变量如何定义和调用
expect 是一个在交互式命令行环境下自动化输入输出的工具。在使用 expect 时我们需要定义一个脚本来描述程序的交互过程然后通过 expect 命令来执行这个脚本。
在 expect 脚本中我们可以使用 set 命令来定义变量。例如下面的代码定义了一个名为 password 的变量并将其值设置为字符串 mypassword
set password mypassword
在脚本中我们可以通过 $ 符号来引用变量。例如下面的代码将会输出变量 password 的值
puts $password
如果我们想要在 expect 脚本中调用外部命令并获取其输出可以使用 exec 命令。例如下面的代码将会调用 ls 命令并将其输出保存到变量 files 中
set files [exec ls]
在脚本中我们可以通过 $ 符号来引用变量。例如下面的代码将会输出变量 files 的值
puts $files
函数传参数给expect应该如何实现
在shell脚本中调用expect脚本时可以使用命令行参数将参数传递给expect脚本。具体实现方法如下
在shell脚本中定义需要传递的参数,例如
#!/bin/bashusernameuserpasswordpass
# ./expect_script.sh $username $password
在expect脚本中使用$1、$2等变量来获取传递的参数例如
#!/usr/bin/expectset username [lindex $argv 0]set password [lindex $argv 1]
这样就可以将shell脚本中定义的参数传递给expect脚本了
#!/bin/bash
ip_choice10.1.1.1
passwd123456con(){
/usr/bin/expect EOF | tail -n 1
spawn ssh root$ip_choice
expect {*password: { send $passwd\r; exp_continue }*yes/no { send yes\r; exp_continue }
}
set spawn_id \$spawn_id
puts \$spawn_id
EOF
}comad(){
spawn_id$(con)
/usr/bin/expect EOF
set spawn_id $spawn_id
expect -i \$spawn_id *#
send -i \$spawn_id echo hellow\r
expect -i \$spawn_id *#
send -i \$spawn_id echo hellow\r
expect -i \$spawn_id eof
EOF
}comad
spawn_id$(con)这条语句的作用是调用con函数并将con函数的输出也就是spawn_id赋值给spawn_id变量
Expect脚本中set命令用于设置变量的值而puts命令用于打印输出。在这个例子中set spawn_id $spawn_id是将当前spawn的进程ID也就是SSH连接的ID赋值给变量spawn_id而puts $spawn_id则是将这个变量的值打印出来。
expect 命令会开的SSH启动一个连接expect -i $spawn_id和send -i $spawn_id来指定我们要在哪个连接上执行命令
| tail -n 1这是一个管道命令它接收前一个命令的输出作为输入。tail -n 1命令会输出输入的最后一行。在这个例子中它会输出expect脚本的最后一行的输出意思是执行expect脚本并返回脚本输出的最后一行。这个输出被赋值给spawn_id变量然后在comad函数中被使用。
用法说明
Expect是一种将现有的实用程序组合起来的胶合剂通常考虑的是如何使Expect利用系统现有的工具解决问题而不是如何在Expect中解决问题。
Expect主要应用涉及商用软件产品。很多这类的产品都会提供某种命令行工具但这些工具缺乏脚本编程的能力只是为了帮助用户管理产品而商家通常不会在如何实现一个稳定性好的脚本语言上耗费很多精力。Expect脚本中可以包含shell查询环境变量通过执行某些Unix命令获得更多的信息然后在产品所带命令行接口中加入必须的信息来完成用户的目标。在产品命令行接口中查询相关信息该脚本可以在多种选择中智能地决定当前应该做什么比较合适。
每次Expect操作完成运行结果将保存在本地环境变量 $expect_out 中。这允许脚本收集这些信息给用户以相应的反馈同时也允许根据当前情况发送相对应的指令。
Expect通常用来建立一组测试套件可以用在程序、组件或者嵌入式系统中。DejaGnu就是利用Expect写成的一组测试套件。它被大量地应用于测试 gcc对于远程目标的测试例如嵌入式开发也是非常合适的。
你可以利用一种叫作”autoexpect”的工具自动生成expect脚本。这个工具观测你的操作并利用启发性知识生成expect脚本。尽管生成的代码可能会很长含义上有点模糊你可以修改生成的脚本使它成为你需要的代码。
观点
利
Expect可通过cron封装系统管理任务在规定的时期运行。能够这样做是因为Expect仅仅使用已经安装在主机中的系统管理工具不需要学习额外的工具。如果程序员学过Tcl那么转移到Expect是一件非常简单的工作相同的编程结构和语法再加上一些内置的额外功能。
业界对室内管理任务使用Expect提供了很大的支持。Expect在很多的公司广泛使用例如Silicon Graphics, IBM, HP, Sun, Xerox, Amdahl, Tektronix, atT, ComputerVision和世界银行利用Expect对开发项目、文件传输、帐号管理、网络测试进行室内自动测试。
Expect已经以多种模块的方式移植到Python和perl语言中。Expect命令的部分子集移植到Java和嵌入到SwichTermJ基于Java的终端仿真器之中。这些例行程序通常是原程序的同等功能的另一种解释方式。一旦你理解了其中的概念如果需要的话换到其它语言也就很容易了。
弊
Expect继承了Tcl的语法规范对于使用其它脚本语言的人来说这是相当陌生的。和其它语言如bash、csh和Perl相比Expect的语法模式是不同的。就像有时候一个变量的前缀冠以”$”有时候又不需要。有些版本的Expect和Perl、Python语言的语法倒是很相似的。
另一个缺陷是在不同的平台移植Expect脚本很难。例如一个Expect脚本使用基于Unix的工具就不可能适合移植到Windows平台。如果可能的话程序员必须找到相应的命令行程序能够提供相同的信息这就可能需要修改expect脚本的send部分而这部分恰恰就是整个脚本的核心。如果你使用的是tcl,perl或者python这些独立于平台的工具使用它们各自的POSIX接口访问文件、对远端交互进行标准的POSIX处理telnet,ftp等等就不会出现上述问题。
一个不明显的缺陷是有时Expect可能并不是解决问题的最好方法。例如一个系统管理员需要登录到多个服务器这些自动的操作要使用Expect就得配以保存的密码而不是更安全的解决方案采用ssh代理密钥。虽然这种自动交互工具很吸引人但是还是有很多其它的办法可以更安全稳定地解决同样的问题。
Expect自动化控制命令行工具但是对图形用户界面就失效了。Windows提供了不少有价值的工具很多是基于图形用户界面的这就是Expect失效的地方了。Windows下图形界面程序可以通过像Autohotkey或者AutoIt等工具来实现自动化控制。