2014年12月10日
有人可以帮助我解决这个问题,其中字符'>'导致perl程序在远程Windows服务器上运行时提前退出?
实际输出是:
K:\ Volume in drive K is DataDisk
Volume Serial Number is E8BD-C593
Directory of K:\
04/15/2011 05:25 AM <DIR
预期输出为:
K:\>dir
Volume in drive K is DataDisk
Volume Serial Number is E8BD-C593
Directory of K:\
12/08/2014 11:18 PM <DIR> ftpvol
04/15/2011 05:25 AM <DIR> Images
1 File(s) 0 bytes
16 Dir(s) 246,180,012,032 bytes free
这是脚本:
#!/usr/bin/perl
use Net::Telnet ();
my $node = $ARGV[0];
my $ipAddress = $ARGV[1];
my $username = $ARGV[2];
my $password = $ARGV[3];
my $mmlCommand0 = "hostname&prcstate -l";
my $filedate = `date +%Y%m%d`; #date in format YYYYMMDD
chomp($filedate); #deletes newline character at end
my $numArgs = $#ARGV + 1;
if($numArgs == 4){
my $telnet = new Net::Telnet( Host=>$ipAddress, Port=>23, Timeout=>20, Errmode=>'die', Prompt=>'/>/');
$telnet->open() or die "hai $telnet->errmsg ";
$telnet->waitfor('/login name:/');
$telnet->print($username);
$telnet->waitfor('/password:/');
$telnet->print($password);
$telnet->waitfor('/Windows NT Domain:/');
$telnet->print("");
$telnet->waitfor('/>/');
## get printouts
#print $telnet->cmd($mmlCommand0);
print $telnet->cmd("K:");
print $telnet->cmd("dir");
}
else{
print "\n!!! Correct syntax is: command <node> <IP address> \nExample: \n\n";
}
print "\n\n";
exit(0);
如果我删除提示或尝试设置另一个提示,脚本不会执行。 但是我觉得这个角色的错误是&#39;&#39;&#39;总是被解释为提示。
my $telnet = new Net::Telnet( Host=>$ipAddress, Port=>23, Timeout=>20, Errmode=>'die');
$telnet->prompt('/$/');
提前致谢!
2014年12月11日
A&#34;回复&#34;按钮会很高兴而不必编辑原始端口......
我不太关注Llama先生的建议。因此,如果我使用函数print()和waitfor(),则不应使用promt。在那种情况下,我删除了提示,但代码仍然无法正常工作。您是否善意发布一个可以检索字符的工作代码示例&#39;&lt;&#39;和&#39;&gt;&#39;在打印输出中,不要将其视为DOS提示符?
答案 0 :(得分:1)
Net::Telnet
文档说明如果您 使用prompt
和print()
进行通信,则只需使用waitfor()
属性(它意味着与login()
一起使用
在您的情况下,正在从响应中删除prompt
值。尝试将prompt
值设置为永远不会发生的值,这应该可以解决您的问题。请注意选择的值,因为prompt
值将被视为正则表达式。