当前位置:首页 > 嵌入式 > 嵌入式动态
[导读]某些情况下需要自动输入密码,您可以用expect。

某些情况下需要自动输入密码,您可以用expect。

自动与交互式程序会话。

脚本

#!/usr/bin/expect -f

argv:接收参数

argc:参数个数

argv0:脚本名

选项

-c "cmd":指定在执行脚本之前执行的命令,这些命令最好用双引号括起,防止被shell分开解释,可以反复使用-c

-d:输出调试信息,报告expect和interact等命令执行时的内部行为,脚本开头写"exp_internal 1"也可以达到同样的效果

-D:交互式调试器

-f:指定命令文件

-i:交互式提示输入命令

--:划定选项尾,如脚本中写 #! /usr/bin/expect - ,则任何命令行的选项都会被解释为参数,被argv接收

命令

setfile “xxx” 设置参数file的值为"xxx"

close:关闭与当前进程的链接

expect和interact都可以检查到进程的退出,隐含执行一个close命令,如果用exec kill pid方式杀进程,则需要显示调用一次close指令

-slave 同时关闭从属进程

-onexec 0 保持spawn_id 开启,1关闭当前的spawn_id

-i 指定关闭的spawn_id

debug:调试

now立即启动调试器,0停止,1启动

disconnect:从终端断开与克隆进程的连接,克隆进程会在后台作为独立进程组继续运行,IO被重定向到/dev/null

send_user "password?\ "

expect_user -re "(.*)\n"

for {} 1 {} {

if [fork]!=0 {sleep 3600;continue}

disconnect #克隆进程继续运行

spawn priv_prog

expect Password:

send "$expect_out(1,string)\r"

. . .

exit

}

Exp_continue[-continue_timer]

这个命令可以使expect继续执行而不是正常的返回.默认情况下,exp_continue会重高超时时钟,-continue_timer选项会阻止时钟重新计数(连续计数).

Exp_internal [-f file] value

如果是value非零的话,使接下来的命令将调试信息输出到Expect和标准错误输出.如果是0的话,输出的信息将会被屏蔽.调试信息包括收到的每条信息和每次尝试用当前输出与脚本中的模式相匹配的信息.如果设置了输出文件,那么正常的和调试的信息都会被写到这个文件当中.(忽略上面value选项的值).任何之前打开的调试输出文件将会被关闭.-info选项使exp_internal返回最近关于non-info参数的描述

Exp_open [args] [-I spawn_id]

它返回对应于原始spawn id的文件描述符.这样这个文件描述符就可以被使用了,就好像这个文件是被Tcl的open指令打开的一样.(这个spawn id将不再使用,wait指令将不能用在这个进程.).-leaveopen选项使spawn id保持打开,以便供Expect命令使用

Exp_pid [-i spawn_id]

它将返回对应于当前被跟踪进程的ID.如果使用-i选项,将返回对应于指定的spawn id的进程ID.

Exp_send:send别名

Exp_send_error:它是Send_error

Exp_send_log:Send_log

Exp_send_tty:Send_tty

Exp_send_user:Send_user

Exp_version [[-exit] version]

它用于确保脚本程序与当前的Expect兼容。在没有参数的情况下,返回当前Expect的版本.这个版本就会编译到脚本中.如果你确切的知道你的脚本程序不需要最新版本的特性,可以指定一个以前的版本

expect_tty [expect_args ],输入是一个tty

expect_user [expect_args],输入是stdin

expect [[-opts] pat1 body1] ... [-opts] patn [bodyn]

等待被监控进程的输出,如果匹配到指定输出字符串、遇到文件尾、或超时时,则执行对应的body体,如果body是空的,将被忽略

-nocase 匹配时不区分大小写

-timeout:选项使得Expect使用选项后面的数值做为超时时间,而不是timeout变量中设置的时间

expect_befor模式,在所有匹配之前隐含调用

expect_after模式,在所有匹配之后隐含调用

expect {

busy {puts busy\n ; exp_continue} # 输出值有busy执行{}里面的语句

failed abort # 输出有failed,执行abort,abort是预定义的一个函数

"invalid password" abort #输出字符串中间有空格,需要用双引号括起来

-re "failed|invalid password" abort #使用正则表达式

-ex "failed|invalid *password" abort #精准正则,不对* ^等转义

-i $proc2 busy {puts busy\n ; exp_continue} #匹配$proc2进程的输出,默认是当前进程的输出

-i $proc3 # 匹配到执行XXX

-i $proc4 # 匹配到执行XXX

any_spawn_id XXX

timeout abort #超时时触发

full_buffer abort #输出的值超过最大的match_max设置的值是触发

null #输出ascii 0时触发

connected

}

匹配时,任何输出都会被保存到expect_out缓冲区中,匹配到的9个字串分别被保存在expect_out(1, string) ~ expect_out(9, string),如果在模式前面使用了 -indeces 选项,则这9个字串的起始位置和结束位置保存在expect_out(X, start)和expect(X, end)中,X∈[0, 9]。expect(0,*)是匹配到的整个字符串,下面三条语句等效

expect "cd"

Set expect_out(0,string) cd

Set expect_out(buffer) abcd

-i选项还可以定义一个全局变量,里面存储着spawn_id列.当变量内容发生变化时,它会被重新读取.这样就可以在程序执行的时候改变I/O源.以这种方式提供的spawn_id被称为”indirect spawn_id”

Fork

复制一个进程,返回新进程ID,失败返回-1

interact [string1 body1] ... [stringn [bodyn]]

将控制权给用户,根据用户的输入,触发相应的动作

set CTRLZ \032

interact {

-reset $CTRLZ {exec kill -STOP [pid]} # 按下ctrl+z触发

\001 {send_user "you typed a control-A\n"; # 发送一个字符串到终端

send "\001"

}

$ {send_user "The date is [exec date]."}

\003 exit

foo {send_user "bar"} # 用户输入foo时触发

~~

}

send:发送字符串给当前进程

send_user:发送字符串到标准输出

send_error:发送字符串到标准错误

send_log:发送字符串到日志文件

send_tty:发送字符串到tty

sleep seconds:休眠

spawn [args] program [args]

创建一个执行program命令的进程,这个进程的三个标准IO都被重定向到expect,

spawn su - ftomcat -c "tar -xzf /tmp/ftomcat.tgz . 1>/dev/null 2>/dev/null"

expect "Password"

send "ftomcat\r"

expect eof

exit

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭