我正在使用Net::Telnet
登录网络设备。
我的提示设置如下:
$telnetConsole = new Net::Telnet(
Timeout => 5,
Errmode => 'die',
Prompt => '/.*(\%|\>|\#|no\)) $/',
);
当我在网络设备的控制台端口上执行以下命令时:
$telnetConsole->print('request virtual-chassis renumber member-id 0 new-member-id 4');
($prematch, $match) = $telnetConsole->waitfor(Match => 'no', Errmode=>'return', Timeout => 4);
它给出了以下结果:
root@switch> request virtual-chassis renumber member-id 0 new-member-id 4
To move configuration specific to member ID 0 to member ID 4, please
use the replace command. e.g. replace pattern ge-0/ with ge-4/
Do you want to continue ? [yes,no] (no)
{master:0}
root@switch>
如您所见,我收到提示root@switch>
,但无法回答子问题[yes, or no]
。我想知道为什么Net :: Telnet不会停在Do you want to....
行,所以我可以输入yes或no。看起来我得到一个额外的回车,这导致回答“否”并返回提示。我也尝试过“put”和单独的put语句“\ n”(回车),但没有运气。
答案 0 :(得分:1)
我与Net :: Telnet和Net :: SSH2进行了斗争,因为他们正在编写脚本来与网络设备通信。我最终切换到Control :: CLI来实现它。在Control :: CLI中,这个(未经测试的)代码应该可以工作(或者接近它):
$telnetConsoleOutput = $telnetConsole->cmd("request virtual-chassis renumber member-id 0 new-member-id 4");
$telnetConsoleOutput = $telnetConsole->cmd("yes");
请注意,没有"等待"在那里? Control :: CLI将通过" cmd"为您处理。功能,至少是我的经验。 Control :: CLI是一个非常好的小包装器,通过telnet,ssh和串行电缆连接。我用它来与Linux服务器和网络设备(SSH和串口)进行交互。它可以为你处理很多东西而你甚至不知道它,并且有信心它可以解决你的问题,只需要很少的返工。
HTH! TheJester1977