我需要通过telnet协议与设备通信。事实证明,它不能处理CR-NUL或CR-LF序列作为输出记录分隔符,只能处理直接CR。否则,它会将CR后面的字符解释为属于下一个命令,然后导致错误。所以我将Output_record_separator设置为CR,但随后在通信转储(在Dump_Log中)中看到,不仅发送了CR(0x0d),还发送了CR NUL(0x0d 0x00)。我可以发送单个字符:如果我只发送一个LF,则只发送一个LF(ox0a)。
此代码显示问题:
#!/usr/bin/env perl
use strict;
use warnings;
use Net::Telnet;
my $host = "192.168.2.223";
my $port = 5000;
my $telnet = new Net::Telnet (
Timeout => 20,
Errmode => 'die',
Port => $port,
Dump_Log => '/tmp/debug',
Output_record_separator => "\015",
Input_record_separator => "\n\r",
Prompt => '/1_.*0/',
Binmode => 1,
);
$telnet->open($host);
$telnet->put("\015");
$telnet->put("\012");
结果如下:
tail: /tmp/debug: file truncated
> 0x00000: 0d 00 ..
> 0x00000: 0a .
如何让Net :: Telnet只发送CR,而不添加更多内容?
答案 0 :(得分:1)
将Telnetmode
设为0
。如果Telnetmode
打开,则CR转换为CR + 0x00。
来自Net :: Telnet来源:
## Convert all CR (not followed by LF) to CR NULL.
while (($pos = index($$string, "\015", $pos)) > -1) {
$nextchar = substr $$string, $pos + 1, 1;
substr($$string, $pos, 1) = "\015\000"
unless $nextchar eq "\012";
您可以使用$telnet->telnetmode(...)
:
telnetmode - 关闭/打开telnet命令解释
$mode = $obj->telnetmode;
$prev = $obj->telnetmode($mode);
此方法控制是否识别和处理数据流中的TELNET命令。 TELNET协议使用数据流中发送的某些字符序列来控制会话。如果您要连接的端口未使用TELNET协议,则应关闭此模式。默认设置为。
如果没有给出参数,则返回当前模式。
如果$ mode为0,则telnet模式关闭。如果$ mode为1,则启用telnet模式。