perl 脚本用telnet模块 如何才能执行远端程序

maria1729 2009-05-22 04:07:00
加精
现在我在远端机器某路径下想运行一个exe的安装文件,已经可以打开远端机器目录了,运行$t->cmd('install.exe');后在远程的机器上看这个安装程序并没有运行起来。并且程序是正常结束没有报错。这是一个静态的后台安装程序没有界面,我在cmd telnet登入后输入命令可以执行,为什么在perl中执行不了?
...全文
881 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
you1009299383 2009-07-30
  • 打赏
  • 举报
回复
呵呵我还看不懂你们那些呀,勤学喽……
yanxu_1234 2009-07-29
  • 打赏
  • 举报
回复
初学者,学习为上
vincent_wwz 2009-07-29
  • 打赏
  • 举报
回复
hi
fibbery 2009-05-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 maria1729 的回复:]
谢谢,我已经想到办法了,程序安装完成后会输出一个log文件,我只要不停的测这个文件是否存在,一旦读到就结束perl
[/Quote]

对,只要能保证install完成在结束telnet,应该就没有问题。
maria1729 2009-05-25
  • 打赏
  • 举报
回复
谢谢,我已经想到办法了,程序安装完成后会输出一个log文件,我只要不停的测这个文件是否存在,一旦读到就结束perl
fibbery 2009-05-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 maria1729 的回复:]
用$t->print和$t->waitfor的效果和$t->cmd一样没有执行起来,并且两次都是perl运行很快就结束了。
而将$t->cmd和$t->waitfor一起用安装程序执行起来了但是
会在my @lines=$t->waitfor('/.+>$/');这一行报pattern match timed-out at telnetInstall.pl line 16
那个安装程序是会失败的,这会影响到perl吗?
因为我在cmd下的telnet执行这个安装很快就到下一行命令提示符了,这时安装程序还在运行。
按你的说法很难解释这…
[/Quote]

这个不难解释,我也在考虑这个问题,你的install程序很可能是执行起来后就在后台运行,命令行实际上是直接返回,但程序还在运行。这是,你用perl程序连接的telnet终端已经退出,该终端运行的install进程也会退出。还有一个办法,但必须install支持。也就是说,install程序如果有内容在屏幕输出,可以使用waitfor来等待。
例如:install执行结束时会在屏幕上输出Done,那么你可以这样:
$t->waitfor(String=>'/Done/',Timeout=>300);#Timeout应该足够长,至少要比正常运行install的时间长

这样可以等待install程序执行结束后,再断开telnet终端链接。
ThirstyCrow 2009-05-22
  • 打赏
  • 举报
回复
把超时设置关掉就行了。
$t->cmd(String  => 'install.exe',
Timeout => undef,
);

maria1729 2009-05-22
  • 打赏
  • 举报
回复
用$t->print和$t->waitfor的效果和$t->cmd一样没有执行起来,并且两次都是perl运行很快就结束了。
而将$t->cmd和$t->waitfor一起用安装程序执行起来了但是
会在my @lines=$t->waitfor('/.+>$/');这一行报pattern match timed-out at telnetInstall.pl line 16
那个安装程序是会失败的,这会影响到perl吗?
因为我在cmd下的telnet执行这个安装很快就到下一行命令提示符了,这时安装程序还在运行。
按你的说法很难解释这种现象是怎么回事。

fibbery 2009-05-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 maria1729 的回复:]
$t->print('install.exe');
my @lines=$t->waitfor('/.+>$/');
print("@lines");
跟前面的有什么不一样吗?
[/Quote]

$t->print只发送命令,
$t->waitfor等待命令执行结束并且收到命令行提示符。

$t->cmd不仅执行命令,并且等待命令结束,但是,不考虑收到命令行提示符。

我的考虑,可能是因为,你的程序,在install程序执行后,没有执行完,可能断开连接了。
maria1729 2009-05-22
  • 打赏
  • 举报
回复
能解释下my @lines=$t->waitfor('/.+>$/'); 是什么意思,要做什么?谢谢
maria1729 2009-05-22
  • 打赏
  • 举报
回复
$t->print('install.exe');
my @lines=$t->waitfor('/.+>$/');
print("@lines");
跟前面的有什么不一样吗?
fibbery 2009-05-22
  • 打赏
  • 举报
回复

$t->print('install.exe');
my @lines=$t->waitfor('/.+>$/');
print("@lines");
maria1729 2009-05-22
  • 打赏
  • 举报
回复
Hi
安装程序是运行起来了,可是perl报错了
在my @lines=$t->waitfor('/.+>$/');这一行报pattern match timed-out at telnetInstall.pl line 16
fibbery 2009-05-22
  • 打赏
  • 举报
回复
还有,你可以在new $t的时候增加一个debug调试文件:
$t=new Net::Telnet(Timeout=>10,Prompt=>'/.+>$/i',Dump_Log=>'F:\Dump_Log.log');


通过debug文件你可以调试你的程序。
fibbery 2009-05-22
  • 打赏
  • 举报
回复
$t->cmd('install.exe');
my @lines=$t->waitfor('/.+>$/');
print("@lines");

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧