2015-01-03 66 views
1

我需要通過telnet協議與設備進行通信。事實證明,它不能處理CR-NUL或CR-LF序列作爲輸出記錄分隔符,只能使用直接CR。否則,它會將CR後面的字符解釋爲屬於下一個命令,這會導致錯誤。因此,我將Output_record_separator設置爲CR,但隨後在通信轉儲(在Dump_Log中)中看到,不僅發送了CR(0x0d),而且還發送了CR NUL(0x0d 0x00)。但我可以發送單個字符:如果我只發送一個LF,只發送一個LF(ox0a)。如何在Net :: Telnet中發送一個CR,而不是Perl中的CR NUL?

這段代碼顯示問題:

#!/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             . 

我怎樣才能讓網::遠程登錄僅發送CR,而無需添加更多的東西?

回答

1

設置Telnetmode0。如果Telnetmode處於打開狀態,則將CR轉換爲CR + 0x00。

從網::指定源:

## 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模式打開。

+0

謝謝你,那是有效的。這是一個更好的解決方案,然後禁用_escape_cr函數(您在上面粘貼),就像我一樣。我錯過了telnetmode開關。 –