Expect手册中文版)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Expect手册中文版1Expect手册中文版最近在搞一个ssh远程反向登陆的工具,就接触到expect工具,从网上找到了些expect资料。这篇文章是由gunman翻译man手册对expect的解释。EXPECT(1)名字:Expect-----能与交互式程序进行“可程序化”会话的脚本语言大纲:(命令选项概述)expect[-dDinN][-ccmds][-[f|b]]cmdfile][args]概述:Expect是一种能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序。根据脚本内容,Expect可以知道程序会提示或反馈什么内容以及什么是正确的应答。它是一种可以提供“分支和嵌套结构”来引导程序流程的解释型脚本语言。另外,还可以在随时需要的时候把控制权交给用户,然后再还给脚本。ExpectK是Expect和Tk的混合体。它就按照Expect和Tk的方式运行。Expect也可以直接嵌入到C或是C++程序中(这种情况是不涉及Tcl解释)。请看libexpect(3).Expect的名字是从被UUCP(UNIX到UNIX的拷贝),Kermit(一种文件传输协议,由哥伦比亚大学设计)和一些其他Modem控制等程序设计思维大众化的“send/expect”时序理念中得出的。不像UUCP,Expect已经被广泛应用于很多你可以想像的到的程序和任务当中了。Expect还能同时和多个程序交互。例如:下面是一些Expect可以做到的事情让你的计算机呼叫你,这样你可以不用付呼叫费。启动一个游戏(例如:rogue),如果不是最佳配置,则一直重新启动,直到是最佳配置为止。然后把控制权转交给你。运行fsck的时候,用”yes”或是”no”来回应fsck的交互问题。在没有预设答案标准的情况下把控制权返还给你。连接到另一个网络或是BBS站点,自动收取你的邮件,就像邮件是发往你的当地系统一样。在执行rlogin,telnet,tip,su,chgrp等等命令的时候保存“环境变量”,“当前目录”或是其他一些信息。有很多原因致使Shell不能完成这样的任务(你自己可以试试看)。而这一切对于Expect来说都是可以的。一般情况下,当一个程序需要程序与用户进行交互的时候就需要用到Expect。还需要的一个前提是这种交互必须能程序化(例如:循环结构,选择结构等等,个人认为必须是有规律可循的)。如果需要的话,Expect还能把控制权返还给用户。同样,用户也可以在任何时候把控制权还给脚本程序。Expect手册中文版2用法:Expect通过读取cmdfile(命令文件)来执行一系列指令。只要系统支持“#!“,在Script脚本文件的首行标明“#!/usr/local/bin/expect–f“,并赋予脚本文件可执行权限,执行脚本文件就可以(隐含方式或是默认)调用Expect。当然,上面的路径必须正确地指明Expect解释程序的位置。/usr/local/bin只是一个例子。-c选项用来标明需要在执行脚本内容之前来执行的命令。这条命令(-c选项后的命令)应该用引号括起来,以免在执行时被shell分开解释。-c选项可能会被反复使用。多条命令可以使用同一个”-c”,命令之间需要用分号隔开。这些命令会按照它们出现的先后顺序执行。(在Expectk中,”-c”相当于”-command”)。-d选项允许输出调试性信息。这些信息主要报告像expect和interact等命令执行时的内部行为。这个选项与写在脚本开头的”exp_internal1”具有同样的效果,同时还会打印出Expect的版本。(strace命令用在跟踪变量声明,trace命令用于跟踪变量的赋值)(在Expectk中,”-d”相当于”-diag”)-D选项开启交互调试器。后面必须跟有一个整数值作为参数,当值为非零或是按下CTRL+C的时候(或是遇到断点,或是在脚本中恰好出现其他的调试语句),调试器会在进行下一次TclProcedure前取得控制权。想了解更多信息请参见README文件或是下面的SEEALSO。(在Expectk中,这个选项相当于”-Debug”)。-f选项指明从哪个文件中读取命令。这个选项是可选的,因为只有当使用”#!”时它才有可能被用到。而其他选项可以写在命令行中。(在Expectk中,它相当于”-file”)。默认情况下,命令文件是全部读入内存一并执行的。但有些时候需要每次只读一行。例如:stdin(标准输入)就是这样读取的。如果强制任意文件以这种方式(每次读一行)执行的话就使用”-b”选项。(在Expectk中,它相当于”-buffer”)。如果”-“被一个文件名替代,那么脚本就会用读指定文件的方式来替代从标准输入读的方式。(例如:”./-“就表示从一个名为”-”的文件中读所需的信息)。-i选项使Expect能交互式的提示输入命令,而不是从文件中读取。在遇到文件尾或是执行了exit命令时,提示输入命令终止。要了解更多信息请参见下面的interpreter。-i选项是假设既不是从一个命令文件读,也没有使用-c选项。(在Expectk中,它相当于”-interactive”)。--是用来为划定选项尾的。当你需要像使用选项一样传一个参数,但希望这个参数不要被当作选项解释时,就需要用到这个选项。当阻止其他选项时,可以把它放在”#!”行中。例如:下面的例子会让所有参数(包括脚本文件名)都存储在argv中。#!/usr/local/bin/expect–注意:当在”#!”行中使用参数时,必须遵守getopt(3)和execve(2)的规定。$exp_library下如果有expect.rc这个文件的话,它会自动被加载为资源文件(应该是类似于标准配置文件,像用户根目录下的.bash_profile文件一样)。除非使用-N选项取消自动加载。(在Expectk中,它相当于”-NORC”)。这个文件被加载后,紧接着用户根目录下的.expect.rc(~/.expect.rc)会被加载。除使用-n选项取消。如果定义了环境变量DOTDIR,那么它被Expect手册中文版3认为是存放有.expect.rc文件的目录。然后从这个目录中读取.expect.rc文件。(在Expectk中,它相当于”-norc”)。这些加载配置文件的动作是出现在执行完-c选项指定的命令之后。-v选项用来打印出版本号,然后退出。(在Expectk中的相应选项是-version)。可选的参数汇成一列,存放在变量argv中。Argc被初始化为argv的长度(变量个数)。Argv0被设置为脚本名称(orbinaryifnoscriptisused)。例如:下面的例子打印出脚本的名称和前三个参数。Send_user“$argv0[lrang$argv02]\n”命令:Expect使用Tcl语言(ToolCommandLanguage).Tcl提供诸如流控制,表达式值和一些其他的特性。像递归调用,定义函数等等。在这里用到的没有说明的命令都是Tcl命令。Expect支持一些额外的命令。下面具体描述。除非另外声明,否则命令返回空字符串。命令按字母顺序排序,这样便于查找。仅管如此,初学者还是觉得按照”spawn,send,expect,interact”这种方式来读比较容易。注意,ExploringExpect这本书中提供了关于”Expect和Tcl”的介绍.这本Manpage手册中也提供了一些例子.但数量有限,因为这本是做为入门的教材手册使用的.在本手册中,以E开头的是指Expect程序,小写e开头的是指expect命令.close[-slave][-onexec0|1][-ispawn_id]关闭与当前进程的连接.大多数交互程序会在它们的stdin(标准输入)中检测到EOF(文件尾),然后退出.所以通常close也有能力杀死进程.-i选项指定了要杀死的对应于spawn_id的进程.expect和interact都能检测到当前程序的退出,并隐含的执行一个关闭.如果你通过执行”execkill$pid”来杀死进程的话,那么你就需要再显式的调用一下close.-onexec选项用来确定spawn_id在开始新的spawnedprocess(我将其翻译为监测进程)时是被关闭还是要被覆盖.如果想保持这个spawn_id打开的话,那么后面的参数需要设为0.一个非零值将会使spawn_id关闭,并可以将这个spawn_id用于新的进程(默认行为).-slave选项是用来关闭从属进程.(参见spawn-pty)。如果在连接中止的时候,从属进程还打开的话,那么它将自动关闭。不管进程是显式的调用或是隐式的被中止,你都需要调用wait命令来清理进程执行的残余。Close不会调用wait。因为在关闭进程的时候,并不能保障它“正常退出”(个人认为,可能是指退出时做相应的清理工作)。要了解更多的信息,请参见wait命令。debug[[-now]0|1]控制Tcl调试器以步进方式执行语句,设置断点等等。在没有参数的情况下,如果调试器没有运行,返回1,否则返回0。用1做参数时,启动调试器,用0做参数时,停止调试器。如果连同-now一起使用的话,调试器将立即启动(也就是说,在debug命令当中)。否则调试器会在执行下一条语句的时候启动。调试命令不会改变任何的traps。可以参见以-D选项启动Expect(参见上面)要了解更多关于debugger的内容,请参见README文件和下面的SEEALSO。Expect手册中文版4disconnect从终端关闭与一个克隆进程的连接,但让它在后台继续运行。这个进程将被赋予为单独的进程组(如果可能的话)。标准I/O被重定向到/dev/null。下面的代码使用disconnect命令使脚本在后台继续运行。if[fork]!=0exitdisconnect下面的脚本需要读取一个密码,然后每小时执行一次,每次执行的时候都要求输入密码。脚本提供了所需的密码,所以你只需输入一次就可以了。(参见能关闭回显的终端命令)。send_userpassword?\expect_user-re(.*)\nfor{}1{}{if[fork]!=0{sleep3600;continue}disconnectspawnpriv_progexpectPassword:send$expect_out(1,string)\r...exit}用这种方式,而不是用Shell后台方式来执行程序的好处是,用disconnect可以在关闭前保存终端参数,然后把它们应用于新的终端中。如果使用&的话,Expect没有机会读取终端参数,因为在Expect取得控制权的时候,终端已经退出了。exit[-opts][status]使Expect退出或是准备退出。-onexit选项使下一个参数做为退出的句柄被使用。没有参数时,返回当前的退出句柄。-noexit选项使Expect准备退出,而不是把控制权暂时返还给系统。用户定义的退出句柄和Expect内部的句柄都是以同样的方式被返回。接下来将不再执行Expect命令。这在Tcl扩展环境下执行Expect时非常有用。保留当前的解释器(在Tk环境中的主窗口)以清除其他的Tcl扩展。如果Expect再次调用exit(这有可能发生),不会返回句柄。退出时,全部连接将关闭,关闭的动作会被监测的进程检测为“到文件尾”。exit只按照正常exit(2)的中的语句来执行,不会引发其他的动作。因此监视的进程如果没有检测到“到文件尾”的话,会继续执行。(能检测更多的情况是很重要的。例如:什么样的信号会发给监测进程,但这些是由系统决定的,它们放在exit(3)的文档中)。如果被监测的进程继续运行的话,将会被init继承。当前的状态信息将做为Expect的退出信息返回(如果没有指明的话,返回信息为0)。退出命令在脚本程序执行的最后才自动隐含的调用。Exp_continue[-continue_timer]Expect手册中文版5这个命令可以使expect继续执行而不是

1 / 24
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功