2010-02-25 4 views
5

मुझे पर्ल के Net::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; 

लॉग फ़ाइल नीचे दिखाई देता है: में आपका स्वागत है SUSE लाइनेक्स एंटरप्राइज सर्वर 10 SP1 (x86_64) के लिए - कर्नेल 2.6.16.46-0.12-डिफ़ॉल्ट (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? 

कोई सुझाव?

उत्तर

3

यदि आप प्राप्त और वापस लौटे गए टेलनेट विकल्पों को लॉग इन करने के लिए option_log फ़ंक्शन का उपयोग करते हैं। आप देखेंगे कि पर्ल डिफ़ॉल्ट रूप से टर्मिनल प्रकार को सर्वर पर नहीं भेजता है। कुछ कारणों से सर्वर टर्मिनल प्रकार को "नेटवर्क" में डिफ़ॉल्ट कर देगा।

ऐसा करने का सही तरीका टर्मिनल प्रकार को पर्ल पक्ष पर सेट करना है।

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

एक ही समस्या के लिए this चर्चा देखें। समाधान (untested) है कि वे प्रस्ताव ज्ञात मान के लिए सावधि पर्यावरण चर सेट करने के लिए है इस तरह के TERM=vt100

+0

मैं एक ही चर्चा देखते हैं, लेकिन कैसे? क्या मुझे अपनी स्थानीय मशीन पर "टीईआरएम = vt100 निर्यात" करने की ज़रूरत है या टेलनेट उपयोगकर्ता के लिए रिमोट मशीन के .profile में निर्यात करें? धन्यवाद! – root1982

+0

@ root1982 या अपने पर्ल स्क्रिप्ट – mob

+0

में '$ ENV {TERM} =' vt100'' 'कहें सभी को धन्यवाद। मेरी अभी भी वही समस्या है। – root1982

0

/etc/प्रोफ़ाइल में के रूप में, आप निम्न पंक्ति खोजना चाहिए:

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

यह वह जगह है लाइन जो समस्या पैदा कर रही है। आप निम्न आदेश चलाकर साथ इस बात की पुष्टि कर सकते हैं:

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

में/usr/share/terminfo/n /, नेटवर्क ../n/net करने के लिए एक कड़ी है। मुझे नहीं पता कि सिस्टम "नेटवर्क" के लिए क्यों काम नहीं करता है।

अस्थायी ठीक निम्न के/etc/प्रोफ़ाइल में लाइन बदलने के लिए है:

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

उपरोक्त आदेश vt100 के लिए नेटवर्क के नक्शे होगा।

1

क्या भी काम करता है आपके तत्काल मूल्य के लिए प्रश्न चिह्न जोड़ने के लिए और फिर गूंज $ अवधि मूल्य पहले आदेश के रूप में भेज रहा है। तो अपने कमांड प्रॉम्प्ट है अगर '>' और गूंज $ TERM 'टर्म' देता है:

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"; 
संबंधित मुद्दे

 संबंधित मुद्दे