perl的expect使用方法,实现非交互式登录。
perl的expect基本使用方法.
以下是代码片段: $exp = new Expect; #new一个Expect. $exp->spawn($command,@params); #fork和exec一个新进程用来执行$command命令. $exp->expect($timeout,$content); #’-re’.在$timeout内,期待出现包含$content内容的正则表达式,如果不加re默认是精确匹配,也可以使用正则表达式,expect($timeout,re=>’’). $exp->send($string); #向终端发送字符 $exp->debug(0|1|2); #打印debug 信息,不同的数字表示不同的bug级别 $exp->interact(); #和用户进行交互,把控制权转交给用户 $exp->soft_close(); #软关闭,直到$timeout时间到达,才关掉该进程 $exp->hard_close(); #硬关闭,立刻关闭该进程 $exp->match(); #返回匹配的结果 $exp->match_number(); #返回匹配的个数 $exp->send_slow(); # 就是让command慢慢敲进去.. $exp->stty(); #它和外部命令 stty 类似,设定 terminal 的模式,-raw 还是 -cooked。开关回显 echo 和 -echo。 |
exp_continue 一般在 expect 命令中使用,它可以避免写第二次 expect 命令,即如果匹配上某个模式,然后需要做一些事情(如输入密码什么的),之后需要继续匹配,因此需要第二次 expect 命令。exp_continue 可以重复本次 expect 命令,因此也就不需要再次写一个 expect 命令,而可以将两个写在一起。
我们想让程序只在后台跑就行了,不会跑到前面来影响我们.所以我们需要expect的关掉终端显示的功能.
以下是代码片段:
$Expect::Log_Stdout = 0;
$exp->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);
建议继续学习:
- python实现自动登录discuz论坛 (阅读:31481)
- 微信扫码登录网页实现原理 (阅读:15414)
- perl更新/修改/删除文本文件内容 (阅读:9358)
- 初探单点登录 SSO (阅读:9141)
- perl大牛flw传说 (阅读:6494)
- perl模块Getopt::Std用法及实例-从命令行读取参数模块 (阅读:5794)
- 你会做Web上的用户登录功能吗? (阅读:5494)
- [Perl] Template::Toolkit 模板技术. (阅读:5346)
- 如何设计用户登录 (阅读:5358)
- 在perl中连接和使用sqlite做数据存储 (阅读:4981)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:lazysa 来源: 懒人运维
- 标签: expect perl 登录
- 发布时间:2009-11-10 23:05:33
-
[90] Oracle MTS模式下 进程地址与会话信
-
[90] 【社会化设计】自我(self)部分――欢迎区
-
[88] 图书馆的世界纪录
-
[87] android 开发入门
-
[85] Go Reflect 性能
-
[81] IOS安全–浅谈关于IOS加固的几种方法
-
[64] 豆瓣是啥?
-
[63] 用邻接表实现无向图
-
[58] OKR 工作法简介
-
[53] 一句话crontab实现防ssh暴力破解