linux expect for(expect for等于什么)
大家好,今天来为大家分享linux expect for的一些知识点,和expect for等于什么的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
linux expect 详解
Expect是基于Tcl语言开发的工具,主要用于自动化交互式操作场景。它能够将需要在多台服务器上执行的交互过程,如SSH登录、FTP登录等,编写成脚本实现自动化完成。尤其在需要对多台服务器执行相同操作时,大大提高了系统管理人员的工作效率。
常用指令命令速查实例:
1.简单例子:自动登录主机。
执行命令后,输出结果如下:
通过spawn开启一次SSH连接后,会要求输入密码,第一个send命令将密码发送到进程,第二个send命令用于退出SSH。
如果未开启进程直接使用send命令,结果会直接输出文本,类似于在bash脚本中直接输出文本。
expect命令与send命令相反,用于等待进程反馈。expect命令可以接收字符串或正则表达式参数,用于匹配并执行相应动作。
若直接在expect程序中expect一个字符串,除非输入特定内容,否则不会执行任何动作。
expect语言使用模式-动作的方式,单一匹配和多分支匹配是其主要匹配方式。
spawn命令用于开启新进程,如SSH连接,发送命令到shell环境中。
interact指令用于等待人工干预,如执行完hostname命令后,留在ssh界面等待操作。
set指令用于设置变量值,如改造基础示例脚本以传递参数。
传参场景下,expect同样支持参数传递。argv变量存储参数数量,argv0为脚本名称。使用puts指令输出参数数量和指定位置的参数值。
incr指令用于增量操作,如数学计算。[]在expect中类似shell中的`或(),用于执行包裹内部的命令。
数组定义结合set指令实现,数组元素之间用空格分隔。数组访问通过[lindex$argv 0]等方法实现。
循环支持for、while、foreach结构,如for循环、while循环和foreach循环的实现。
通过修改基础实例代码,实现SSH自动登录,自动回答系统提示,简化了人工操作。
Linux系统里的expect里面怎么打印当前时间
在 expect中可以通过调用 Tcl内置的 clock模块来获取当前时间。具体可以使用以下命令来获取当前时间并输出到终端:
set now [clock format [clock seconds]-format"%Y-%m-%d%H:%M:%S"]
puts"当前时间为:$now"
上述代码中,首先使用 clock seconds命令获取当前时间戳,然后通过 clock format命令将时间戳格式化为指定的日期时间字符串。其中,-format参数用于指定日期时间字符串的格式,例如%Y-%m-%d%H:%M:%S表示年月日时分秒。最后使用 puts命令将当前时间字符串输出到终端。
expect脚本在Linux下是如何使用的
如果你是expect脚本语言的新手,可以首先从我们的expect的“hello world”样例(英文)开始。
1,使用“-c”选项,从命令行执行expect脚本
expect可以让你使用“-c”选项,直接在命令行中执行它,如下所示:
$ expect-c'expect"\n"{send"pressed enter\n"}
pressed enter
$
如果你执行了上面的脚本,它会等待输入换行符(\n)。按“enter”键以后,它会打印出“pressed enter”这个消息,然后退出。
2,使用“-i”选项交互地执行expect脚本
使用“-i”选项,可以通过来自于标准输入的读命令来交互地执行expect脚本。如下所示:
$ expect-i arg1 arg2 arg3
expect1.1>set argv
arg1 arg2 arg3
expect1.2>
正常情况下,当你执行上面的expect命令的时候(没有“-i”选项),它会把arg1当成脚本的文件名,所以“-i”选项可以让脚本把多个参数当成一个连续的列表。
当你执行带有“-c”选项的expect脚本的时候,这个选项是十分有用的。因为默认情况下,expect是交互地执行的。
3,当执行expect脚本的时候,输出调试信息
当你用“-d”选项执行代码的时候,你可以输出诊断的信息。如下所示:
$ cat sample.exp
#!/usr/bin/expect-f
expect"\n";
send"pressed enter";
$ expect-d sample.exp
expect version 5.43.0
argv[0]= expect argv[1]=-d argv[2]= sample.exp
set argc 0
set argv0"sample.exp"
set argv""
executing commands from command file sample.exp
expect: does""(spawn_id exp0) match glob pattern"\n"? no
expect: does"\n"(spawn_id exp0) match glob pattern"\n"? yes
expect: set expect_out(0,string)"\n"
expect: set expect_out(spawn_id)"exp0"
expect: set expect_out(buffer)"\n"
send: sending"pressed enter" to{ exp0 pressed enter}
4,使用“-D”选项启动expect调试器
“-D”选项用于启动调试器,它只接受一个布尔值的参数。这个参数表示提示器必须马上启动,还是只是初始化调试器,以后再使用它。
$ expect-D 1 script
“-D”选项左边的选项会在调试器启动以前被处理。然后,在调试器启动以后,剩下的命令才会被执行。
$ expect-c'set timeout 10'-D 1-c'set a 1'
1: set a 1
dbg1.0>
5,逐行地执行expect脚本
通常,expect会在执行脚本之前,把整个脚本都读入到内存中。“-b”选项可以让expect一次只读取脚本中的一行。当你没有写完整个脚本的时候,这是十分有用的,expect可以开始执行这个不完整的脚本,并且,它可以避免把脚本写入到临时文件中。
$ expect-b
6,让expect不解释命令行参数
你可以使用标识符让expect不解释命令行参数。
你可以像下面这样的读入命令行参数:
$ cat print_cmdline_args.exp
#!/usr/bin/expect
puts'argv0: [lindex$argv 0]';
puts'argv1: [lindex$argv 1]';
当执行上面的脚本的时候,会跳过命令行选项,它们会被当成参数(而不是expect选项),如下所示:
$ expect print_cmdline_args.exp-d-c
argv0:-d
argv1:-c