2010-02-25 17 views
5

Tôi gặp sự cố khi kết nối với máy Linux SUSE bởi mô-đun Net::Telnet của Perl. Mã này trông giống như dưới đây:Làm cách nào để khắc phục "loại thiết bị đầu cuối không xác định" khi kết nối với Net của Perl :: Telnet?

my $t = new Net::Telnet (Timeout => 20); 
$t->open($server); 
$t->input_log("telnet.log"); 
$t->login($user, $pass); 
my @lines=$t->cmd($command); 
print @lines; 

Các file log trông giống như dưới đây: Chào mừng bạn đến SUSE Linux Enterprise Server 10 SP1 (x86_64) - Kernel 2.6.16.46-0.12-mặc định (5).

vm-sles10u5 login: <myuser> 
Password: 
Last login: Thu Feb 25 10:41:07 EST 2010 from <mymachine> on pts/5 
tset: unknown terminal type network 
Terminal type? 

Mọi đề xuất?

Trả lời

3

Nếu bạn sử dụng chức năng option_log để ghi lại các tùy chọn telnet đã nhận và trả về. Bạn sẽ thấy rằng Perl không gửi kiểu thiết bị đầu cuối đến máy chủ theo mặc định. Máy chủ sẽ mặc định loại thiết bị đầu cuối thành "mạng" vì một số lý do.

Cách đúng để thực hiện việc này là đặt loại thiết bị đầu cuối ở phía bên perl.

my $termtype = 'vt100'; my $telopt_ttype_ok = ''; 
my $t = new Net::Telnet (Timeout => 5); 

$t->option_callback(\&opt_callback); 
$t->option_accept(Do=>Net::Telnet->TELOPT_TTYPE); 
$t->suboption_callback(\&subopt_callback); 

$t->open($server); 
$t->input_log("runRemoteCommand_telnet.log"); 
$t->login($user, $pass); 
$t->cmd($command); 

exit 0; 

sub opt_callback { 
    my ($obj, $option, $is_remote, $is_enabled, $was_enabled, $buf_position) = @_; 
    if ($option == Net::Telnet->TELOPT_TTYPE and $is_enabled and !$is_remote) { 
    $telopt_ttype_ok = 1; 
    } 
    1; 
} 

sub subopt_callback { 
my ($obj, $option, $parameters) = @_; 
my ($ors_old, $otm_old); 
if ($option == Net::Telnet->TELOPT_TTYPE) 
{ 
    $ors_old = $obj->output_record_separator(''); 
    $otm_old = $obj->telnetmode (0); 
    $obj->print("\xff\xfa", pack("CC", $option, 0), $termtype, "\xff\xf0"); 
    $obj->output_record_separator($ors_old); 
    $obj->telnetmode ($otm_old); 
} 
1; 
} 

Refer to this

1

Xem this thảo luận cho cùng một vấn đề. Các giải pháp (chưa được kiểm tra) mà họ đưa ra là để thiết lập biến MÔI TRƯỜNG HẠN đến một giá trị nổi tiếng, chẳng hạn như TERM=vt100

+0

Tôi thấy cùng một cuộc thảo luận, nhưng làm cách nào? Tôi có cần phải "xuất khẩu TERM = vt100" trên máy địa phương của tôi hoặc xuất khẩu trong .profile của máy từ xa cho người dùng telnet? Cảm ơn! – root1982

+0

@ root1982 hoặc nói '$ ENV {TERM} = 'vt100'' trong tập lệnh Perl của bạn – mob

+0

Cảm ơn mọi người. Tôi vẫn có cùng một vấn đề. – root1982

0

Trong/etc/profile, bạn nên tìm dòng sau:

test -x /usr/bin/tset && /usr/bin/tset -I -Q 

Đây là dòng gây ra sự cố. Bạn có thể xác nhận bằng cách chạy lệnh sau:

$>TERM=network 
$>/usr/bin/tset -I -Q 
tset: unknown terminal type network 
Terminal type? 

Trong/usr/share/terminfo/n /, mạng là một liên kết đến ../n/net. Tôi không biết tại sao hệ thống không hoạt động với "mạng".

Các temp sửa chữa là thay đổi dòng trong/etc/profile như sau:

test -x /usr/bin/tset && /usr/bin/tset -I -Q -m network:vt100 

Lệnh trên sẽ lập bản đồ mạng để vt100.

1

Điều gì làm việc quá là thêm dấu hỏi để giá trị nhanh chóng của bạn và sau đó gửi như lệnh đầu tiên echo giá trị $ HẠN. Vì vậy, nếu dấu nhắc lệnh của bạn là '>' và echo $ TERM cho 'xterm':

my $t = new Net::Telnet ( Timeout => 3, 
          Prompt => '/[\?>]/', 
          Dump_log => $dumplog, 
          Host => $host, 
          Input_log => $inputlog, 
          Output_log => $outputlog, 
        ); 

$t->login($username, $password); 
my @lines = $t->cmd("xterm"); 
@lines = $t->cmd("who"); 
print @lines, "\n"; 
@lines = $t->cmd("uptime"); 
print @lines, "\n"; 
Các vấn đề liên quan