深入Perl的expect
Perl实在大方便了,如果用它来玩expect,是相当的好,不用在学一次expect的语法.只要了解perl就行了. 下面是我看官方的文章还有自己使用中总结的一些经验.呵呵,我有新的心得就会来更新的….
perl的expect基本使用方法.
以下是代码片段: $exp = new Expect; #new一个Expect. |
exp_continue 一般在 expect 命令中使用,它可以避免写第二次 expect 命令,即如果匹配上某个模式,然后需要做一些事情(如输入密码什么的),之后需要继续匹配,因此需要第二次 expect 命令。exp_continue 可以重复本次 expect 命令,因此也就不需要再次写一个 expect 命令,而可以将两个写在一起。
我们想让程序只在后台跑就行了,不会跑到前面来影响我们.所以我们需要expect的关掉终端显示的功能.
以下是代码片段: $Expect::Log_Stdout = 0; |
注:0为关掉显示,1为打开
希望expect一直等到某个字符出现需要怎么样做
以下是代码片段: $exp->expect(undef,sub {}) |
如果不希望expect等,就使用$exp->expect(0),这样当前如果有这个字符就成功,没有就跳过.
取得expect的命令行中有输出,使用before来取得数据来进行处理
以下是代码片段: my $read = $exp->before(); print $read; |
注意,这个得到的内容,是从expect中匹配到的内容.
在使用expect时,日志中有很多特别的符号,使用下面这个terminal type的设定,就会好了. 不知为什么,日志文件中会有很多^[ ,^G之类的字符,如果用了下面的参数就行了,只有一个^M,这个用dos2unix就行了
以下是代码片段: $ENV{TERM} = "xterm"; |
打开内部调试,这样可以让后续命令的诊断信息发送到 Expect 所控制的 stderr,这样可以显示出比如$exp->expect()中的内容是否匹配.这样可以显示看到显示的字符,方便调试匹配规则,
以下是代码片段: $exp->exp_internal(1); |
注意:internal这个必须写到spawn后面 打开debug模块,可以显示连接的过程,进程的退出之类的状态
以下是代码片段: $exp->debug(3); |
记录expect的日志到一个文件
以下是代码片段: $exp->log_stdout(1); $exp->log_file("output.log"); #注意,这句一定要写在Expect->spawn之后,不然expect会没有日志输出 中间发送和匹配之类的过程....... $exp->log_file(undef); |
在expect时,追加日志到一个文件
以下是代码片段: $exp->log_file("filename"); |
默认是追加,如果要修改就用
以下是代码片段: $exp->log_file("filename", "w"); |
在perl的expect中怎么发送控制字符,
比如
以下是引用片段: ctrl+c control-G $exp->send("\\cG"); control-c $exp->send("\\cC";); |
我设置了一个终端大小,但是修改窗口大小后,我的Expect不能发现窗口改变. 主要是远程不能抓到本地的WINCH"window size changed"的信号,当我修改我本地终端大小时需要传送信息给spawn.
以下是代码片段: my $exp = new Expect; $exp->slave->clone_winsize_from(\*STDIN); $exp->spawn("ssh somehost); $SIG{WINCH} = \&winch; sub winch { $exp->slave->clone_winsize_from(\*STDIN); kill WINCH => $exp->pid if $exp->pid; $SIG{WINCH} = \&winch; } $exp->interact(); |
一个简单的Perl使用Expect自动登陆服务器的实例
以下是代码片段: #!/usr/bin/perl use Expect; $Expect::Log_Stdout = 1; $ENV{TERM} = "vt100"; my ($host,$pass) = ("host","passwd"); my $exp = Expect->new; $exp = Expect->spawn("ssh -l root $host"); $exp->log_file("output.log", "w"); $exp->expect(2,[ qr/password:/i, sub { my $self = shift ; $self->send("$pass\n"); exp_continue; } ], [ ’connecting (yes/no)’, sub { my $self = shift ; $self->send("yes\n"); } ] ); #$exp->interact() if ($exp->expect(undef,’#’)); $exp->send("uptime\n") if ($exp->expect(undef,’#’)); $exp->send("exit\n") if ($exp->expect(undef,’#’)); $exp->log_file(undef); |
建议继续学习:
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:扶凯 来源: 扶凯
- 标签: expect
- 发布时间:2009-10-25 22:36:32
- [55] IOS安全–浅谈关于IOS加固的几种方法
- [53] android 开发入门
- [53] 如何拿下简短的域名
- [52] 图书馆的世界纪录
- [50] Go Reflect 性能
- [50] Oracle MTS模式下 进程地址与会话信
- [48] 【社会化设计】自我(self)部分――欢迎区
- [47] 读书笔记-壹百度:百度十年千倍的29条法则
- [36] 程序员技术练级攻略
- [29] 视觉调整-设计师 vs. 逻辑