2012-03-21 30 views
10

मेरे पास एक सर्वर है जो प्रबंधन के लिए टेलनेट कनेक्शन स्वीकार करता है। मुझे कमांड इतिहास याद आती है इसलिए मैं अपना टेलनेट सत्र इसे समर्थन देना चाहता हूं। मेरे प्रश्न:टेलनेट क्लाइंट पर कमांड इतिहास कैसे कार्यान्वित करें? (ऊपर/नीचे तीर)

1) क्या मुझे इसे सर्वर की तरफ लागू करना है, तो सर्वर क्लाइंट को पिछले आदेश भेज देगा और फिर क्लाइंट फिर से निष्पादित कर सकता है?

2) क्या टेलनेट क्लाइंट (सर्वर के साथ गड़बड़ नहीं) में इस कार्यक्षमता को लागू करने के लिए वैसे भी है?

यदि उत्तर 1 है) तो मुझे पता होना चाहिए कि प्रवेश करने के बिना मेरे टेलनेट सत्र पर ऊपर और नीचे तीर कुंजियों को कैप्चर और भेजना है।

उत्तर

33

यह एक सर्वर समस्या नहीं है। अपने टेलनेट क्लाइंट के साथ बस rlwrap का उपयोग करें। यह आपको प्रोग्रामिंग के साथ readline देता है।

$ rlwrap telnet server port 

(। मैं वास्तव में nc बजाय telnet के बाद से यह उपयोग करने के लिए आसान है और अधिक मजबूत है का उपयोग करें)

+0

10000000 धन्यवाद! – chrisapotek

+1

यह एक आकर्षण की तरह काम किया! – chrisapotek

+0

यहां एक समस्या: ^] बाहर निकलने के लिए काम नहीं करता है। :( – chrisapotek

5

उपयोग socat:

socat readline,history=$HOME/.telnet_history TCP:host:23 
+1

नोट: यदि 'इतिहास' छोड़ा गया है, तो फ़ाइल '$ HOME/.history' फ़ाइल का उपयोग किया जाता है। – Lekensteyn

+1

दुर्भाग्य से नवीनतम उबंटू/डेबियन पर काम नहीं करता है, [लाइसेंसिंग समस्या के कारण] (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=677371)। –

1

मैं यह सोचते कर रहा हूँ कि यह एक आप सेवा है आपके टैग के आधार पर पर्ल में लिखा है।

आप सीपीएएन से टर्म :: रीडलाइन मॉड्यूल का उपयोग कर सकते हैं जो आप चाहते हैं। सीपीएएन वेबसाइट से, यहां एक मूल उदाहरण है:

use Term::ReadLine; 
    my $term = Term::ReadLine->new('My Management Service'); 
    my $prompt = "Enter your management command: "; 
    my $OUT = $term->OUT || \*STDOUT; 
    while (defined ($_ = $term->readline($prompt))) { 
     my $res = eval($_); 
     warn [email protected] if [email protected]; 
     print $OUT $res, "\n" unless [email protected]; 
     $term->addhistory($_) if /\S/; 
    }