如果在perl中使用telnet的条件不起作用

时间:2014-05-30 14:39:21

标签: perl

我正在尝试使用if条件检查命令是否已通过,但它无效。即使挂载成功,它也会失败。当我输入此命令时,它会重新启动到没有任何消息的提示,因此我将与“”进行比较。当我执行目标文件夹的“ls”时,它会显示源文件夹的所有内容。有帮助吗?我的if条件是否正确?

my $port  = new Net::Telnet->new(Host=>$ip,Port=>$ip_port,Timeout => "$timeout", Dump_Log => "dumplog.log",  Errmode=> "return" );
if($port->cmd("mount -t nfs -o nolock <path-of-source-folder> <destination-folder>") eq "")
{
        print "Successful\n";
}
else{
        print "Failed.\n ";
}

2 个答案:

答案 0 :(得分:1)

在标量上下文中,Net :: Telnet cmd方法在成功时返回1(不是字符串)。你的支票应该是这样的:

if ($port->cmd("mount -t nfs -o nolock <path-of-source-folder> <destination-folder>") == 1)
{
    print "Successful\n";
} else {
    print "Failed.\n";
}

如果您确实想从mount命令收集输出并检查它,则必须在列表上下文中调用它或传递stringref参数,如下所示:

my @outlines = $port->cmd("mount ...");

或者:

my $out;
my $ret = $port->cmd("mount ...", [Output => \$out]);
if ($ret == 1)
{
    # inspect $out
}

有关详情,请参阅Net::Telnet documentation

答案 1 :(得分:0)

您检查结果似乎是错误的。 Net::Telnet的文件说明了

  

此方法发送命令$ string,并读取命令发回的字符,直到并包括匹配的提示符。它假设你要发送的程序是某种命令,提示解释器,如shell。   命令$ string会自动附加output_record_separator,默认情况下为&#34; \ n&#34;。这类似于某人输入命令并点击返回键。设置output_record_separator以更改此行为。

     

在标量上下文中,从远程端读取的字符将被丢弃,成功时将返回1。

所以你需要检查一个标量上下文

if ($port->cmd("..") ) {
    ...
}