2011-08-10 9 views
57

मैं बैश स्क्रिप्ट का उपयोग करके कुछ टेलनेट से संबंधित कार्यों को स्वचालित करने पर काम कर रहा हूं। एक बार स्वचालित होने पर टेलनेट के साथ उपयोगकर्ता का कोई संपर्क नहीं होगा। (यह है कि यह पूरी तरह से स्वचालित हो जाएगा)बैश स्क्रिप्ट का उपयोग कर स्वचालित टेलनेट सत्र

स्क्रिप्ट कुछ इस तरह दिखता है:

  1. कैसे पर आदेश पर अमल करने के लिए:

    # execute some commands on the local system 
    # access a remote system with an IP address: 10.1.1.1 (for example) 
    
    telnet 10.1.1.1 
    
    # execute some commands on the remote system 
    # log all the activity (in a file) on the Local system 
    # exit telnet 
    # continue on with executing the rest of the script. 
    

    2 समस्याओं मैं यहाँ का सामना करना पड़ रहा हैं स्क्रिप्ट से दूरस्थ प्रणाली (मानव बातचीत के बिना)?

    कुछ परीक्षण कोड के साथ मेरा अनुभव से, मैं निकालना है कि जब टेलनेट 10.1.1.1 निष्पादित किया जाता है, टेलनेट एक इंटरैक्टिव सत्र में चला जाता है और पटकथा में कोड के बाद लाइनों स्थानीय सिस्टम पर क्रियान्वित कर रहे हैं सक्षम था । मैं स्थानीय की बजाय रिमोट सिस्टम पर कोड की रेखा कैसे चला सकता हूं?

  2. मैं स्थानीय सिस्टम पर टेलनेट सत्र में गतिविधि के लिए लॉग फ़ाइल प्राप्त करने में असमर्थ हूं। मैं जिस स्टडआउट रीडायरेक्ट का उपयोग करता हूं वह रिमोट सिस्टम पर एक प्रति बनाता है (मैं स्थानीय सिस्टम में लॉग कॉपी करने के लिए एक कॉपी ऑपरेशन नहीं करना चाहता)। मैं इस कार्यक्षमता को कैसे प्राप्त कर सकता हूं?

उत्तर

60

expect स्क्रिप्ट लिखें। उस उद्देश्य के लिए

#!/usr/bin/expect 

#If it all goes pear shaped the script will timeout after 20 seconds. 
set timeout 20 
#First argument is assigned to the variable name 
set name [lindex $argv 0] 
#Second argument is assigned to the variable user 
set user [lindex $argv 1] 
#Third argument is assigned to the variable password 
set password [lindex $argv 2] 
#This spawns the telnet program and connects it to the variable name 
spawn telnet $name 
#The script expects login 
expect "login:" 
#The script sends the user variable 
send "$user " 
#The script expects Password 
expect "Password:" 
#The script sends the password variable 
send "$password " 
#This hands control of the keyboard over two you (Nice expect feature!) 
interact 
+1

'उम्मीद' ज्यादातर इंटरैक्टिव सत्रों के लिए है। मैं एक स्वचालित गैर-इंटरैक्टिव सत्र चाहता हूं। मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि मैं रिमोट सिस्टम (टेलनेट के माध्यम से) पर स्क्रिप्ट चलाने में असमर्थ हूं क्योंकि _telnet 10.1.1.1_ के बाद की सभी लाइनें मशीन की बजाय स्थानीय मशीन पर निष्पादित की जाती हैं। – khan

+1

थॉमस टेलीेंस्की ने आपकी आवश्यकताओं के आधार पर बताया कि एसएसएच अंततः आसान है। लेकिन उम्मीद पूरी तरह से गैर-संवादात्मक हो सकती है। मुझे लगता है कि आप यह मान रहे हैं कि टेलनेट के बाद की सभी पंक्तियां आप उस मामले में रिमोट मशीन पर निष्पादित करना चाहते हैं, बस उन्हें कमांड स्क्रिप्ट में जोड़ें और इंटरैक्ट कमांड को हटाएं। लेकिन एसएसएच आसान और अधिक सुरक्षित है। – joemooney

+1

पर्याप्त मेला। मैं इस काम के लिए उम्मीद का उपयोग करूँगा। – khan

1

उपयोग ssh:

यहाँ एक उदाहरण है। पासवर्ड का उपयोग किए बिना कुंजी उत्पन्न करें और इसे दूरस्थ मशीन पर .authorized_keys पर रखें। दूरस्थ रूप से चलाने के लिए स्क्रिप्ट बनाएं, इसे दूसरी मशीन पर कॉपी करें और फिर इसे एसएसएच का उपयोग करके दूरस्थ रूप से चलाएं।

मैंने बड़ी सफलता के साथ कई बार इस दृष्टिकोण का उपयोग किया। यह भी ध्यान रखें कि यह टेलनेट से कहीं अधिक सुरक्षित है।

+1

'ssh' निश्चित रूप से 'टेलनेट' से अधिक सुरक्षित है, लेकिन कुछ आईपी डिवाइस सिर्फ' ssh' सेवा प्रदान नहीं करते हैं और ' डिवाइस का उपयोग करने के लिए टेलनेट प्रोटोकॉल। – fduff

+2

टेलनेट (प्रोग्राम) किसी भी (या अधिक व्यावहारिक रूप से सबसे अधिक) टेक्स्ट-आधारित क्लाइंट/सर्वर कनेक्शन के लिए क्लाइंट के रूप में उपयोग किया जा सकता है। इसका उपयोग आसान परीक्षण के लिए किया जा सकता है, उदाहरण के लिए, HTTP और IMAP। @ टोमास का सुझाव एसएसएच के साथ टेलनेट (रिमोट लॉगिन सेवा) के उपयोग को प्रतिस्थापित करना है। जबकि उनकी टिप्पणी सच है, शायद यह नहीं है कि ओपी की क्या आवश्यकता थी। –

+0

रोब, टेलनेट का उपयोग वास्तव में किसी भी बंदरगाह से कनेक्ट करने के लिए किया जा सकता है, लेकिन ओपीएस प्रश्न देखें - उनके संदर्भ में वह केवल * लॉगिन * के लिए टेलनेट का उपयोग करना चाहता है (उद्धरण: * "रिमोट सिस्टम पर कुछ आदेश निष्पादित करें" *)। इस उद्देश्य के लिए टेलनेट का उपयोग करना बहुत जोखिम भरा है। – TMS

60

जबकि मैं अपेक्षाओं का उपयोग करने का सुझाव दूंगा, गैर-इंटरैक्टिव उपयोग के लिए, सामान्य शेल आदेश पर्याप्त हो सकते हैं। टेलनेट, stdin पर अपने आदेश को स्वीकार करता है, ताकि आप केवल पाइप की जरूरत है या इसे में आदेशों लिखें:

telnet 10.1.1.1 <<EOF 
remotecommand 1 
remotecommand 2 
EOF 

(संपादित करें: टिप्पणियों से परखने के बाद, दूरदराज के आदेश कुछ समय आदानों या जल्दी SIGHUP है पर कार्रवाई करने की जरूरत है नहीं टेलनेट से शान से लिया जाता है। इन मामलों में, आप,, इनपुट :)

{ echo "remotecommand 1"; echo "remotecommand 2"; sleep 1; } | telnet 10.1.1.1 

किसी भी मामले में एक छोटी नींद की कोशिश कर सकते हैं अगर यह इंटरैक्टिव या कुछ भी हो रहा है expect का उपयोग करें।

+2

यह काम नहीं करेगा क्योंकि आप ईओएफ के साथ कनेक्शन बंद करते हैं। – TMS

+4

+1 'नींद' और ब्रेस्ड अभिव्यक्तियों के लिए +1 – vyom

+1

+1 'नींद' एक सपने की तरह काम करता है ;-) मैंने भी जोड़ा है। टीई/देव/टीटीआई | 'स्क्रीन पर पूर्ण सत्र रखने के बीच ;-) – paluh

-3

tcpdump या wireshark और देखो के साथ खेलने के क्या आदेशों सर्वर पर ही

लिए भेजा जाता है इस

printf (printf "$username\r\n$password\r\nwhoami\r\nexit\r\n") | ncat $target 23 

कुछ सर्वर पासवर्ड के साथ एक देरी की आवश्यकता के रूप में यह ढेर

पर लाइनों नहीं रखता है की कोशिश करो
printf (printf "$username\r\n";sleep 1;printf "$password\r\nwhoami\r\nexit\r\n") | ncat $target 23** 
+5

नवीनता अशिष्टता के लिए कोई बहाना नहीं है। कृपया एफएक्यू http://stackoverflow.com/faq देखें। – Verbeia

+1

अपमानजनक नहीं था, जैसे ... मुझे नहीं पता, माफ़ी। मैं सिर्फ समाधान के रूप में उम्मीद कमांड का उपयोग कर लोगों को देख रहा हूं। मैं सिर्फ लोगों को यह महसूस करना चाहता हूं कि आप जो हासिल करने की कोशिश कर रहे हैं उसे समझने के लिए एक बेहतर समाधान है। उम्मीद कमांड आपको यह नहीं दिखाता है कि यह कैसे काम कर रहा है, यह जानने के लिए सिर्फ एक कामकाज है। यह तब ज्यादा भ्रमित नहीं है। जब संदेह में स्रोत पर जाएं। यदि स्रोत उपलब्ध नहीं है, और यदि यह नेटवर्क प्रोटोकॉल, tcpdump, wireshark, पैकेट को स्नूप करें और कमांड प्रवाह का पालन करें और आपको कार्य ज्ञान के साथ कुछ एक साथ रखने में सक्षम होना चाहिए। – str8

+3

यदि आप ऐसा कहते हैं - मैं गणित प्रोग्रामर हूं इसलिए आपके उत्तर और टिप्पणी का पदार्थ मेरे लिए एक रहस्य है। लेकिन मैं जानबूझकर अपमानजनक होने के लिए "बेवकूफों" शब्द की व्याख्या करने में अकेला नहीं हूं। मुझे लगता है कि आपको साइट पर थोड़ा और समय बिताना होगा और देखें कि लोग यहां कैसे व्यवहार करते हैं। – Verbeia

37

टेलनेट अक्सर इस्तेमाल किया जाता है जब आप HTTP प्रोटोकॉल सीखते हैं। मैं अपने वेब-स्क्रेपर के एक भाग के रूप में है कि स्क्रिप्ट का उपयोग करते थे:

echo "open www.example.com 80" 
sleep 2 
echo "GET /index.html HTTP/1.1" 
echo "Host: www.example.com" 
echo 
echo 
sleep 2 

की पटकथा के नाम मान लीजिए तो get-page.sh है:

get-page.sh | telnet 

आप एक HTML दस्तावेज़ दे देंगे ।

आशा है कि यह किसी के लिए उपयोगी होगा;)

+1

सबसे उपयोगी टिप्पणी! यह वास्तव में आपको लूप –

+0

में डालकर कमांड भेजने को स्वचालित करने देता है http://blog.tonycode.com/tech-stuff/http-notes/making-http-requests-via-telnet – meurer

2

आप उम्मीद लिपियों बैश के instaed उपयोग कर सकते हैं। उदाहरण नीचे कोई पासवर्ड

#!/usr/bin/expect 

set ip "<ip>" 

spawn "/bin/bash" 
send "telnet $ip\r" 
expect "'^]'." 
send "\r" 
expect "#" 
sleep 2 

send "ls\r" 
expect "#" 

sleep 2 
send -- "^]\r" 
expect "telnet>" 
send "quit\r" 
expect eof 
9

यह मेरे लिए काम किया ..

मैं कई टेलनेट लॉगिन जो एक उपयोगकर्ता नाम और पासवर्ड की आवश्यकता होती है स्वचालित करने के लिए कोशिश कर रहा था होने एक एम्बेडेड बोर्ड में telnex करने के लिए कैसे दिखा। टेलीनेट सत्र को अनिश्चित काल तक पृष्ठभूमि में चलाने की आवश्यकता है क्योंकि मैं अलग-अलग सर्वरों से लॉग को अपनी मशीन पर सहेज रहा हूं।

telnet.sh टेलनेट लॉगिन 'उम्मीद' आदेश का उपयोग कर स्वचालित करता है। अधिक जानकारी यहां पाया जा सकता: http://osix.net/modules/article/?id=30

telnet.sh

#!/usr/bin/expect 
set timeout 20 
set hostName [lindex $argv 0] 
set userName [lindex $argv 1] 
set password [lindex $argv 2] 

spawn telnet $hostName 

expect "User Access Verification" 
expect "Username:" 
send "$userName\r" 
expect "Password:" 
send "$password\r"; 
interact 

sample_script.sh telnet.sh चलाकर टेलनेट सत्र से प्रत्येक के लिए एक पृष्ठभूमि प्रक्रिया बनाने के लिए प्रयोग किया जाता है। कोड के टिप्पणी अनुभाग में अधिक जानकारी मिल सकती है।

sample_script.sh

#!/bin/bash 
#start screen in detached mode with session-name 'default_session' 
screen -dmS default_session -t screen_name 
#save the generated logs in a log file 'abc.log' 
screen -S default_session -p screen_name -X stuff "script -f /tmp/abc.log $(printf \\r)" 
#start the telnet session and generate logs 
screen -S default_session -p screen_name -X stuff "expect telnet.sh hostname username password $(printf \\r)" 
  1. सुनिश्चित करें कि कोई स्क्रीन आदेश 'स्क्रीन -LS' का उपयोग करके backgroud में चल रहा है सुनिश्चित करें।
  2. http://www.gnu.org/software/screen/manual/screen.html#Stuff पढ़ें स्क्रीन और उसके विकल्पों के बारे में अधिक पढ़ने के लिए।
  3. '-p' विकल्प sample_script.sh '-X' विकल्प के माध्यम से कमांड भेजने के लिए एक विशिष्ट विंडो को पूर्व निर्धारित करता है और फिर से दोहराता है अन्यथा आपको 'कोई स्क्रीन सत्र नहीं मिला' त्रुटि मिलती है।
0
#!/bin/bash 
ping_count="4" 
avg_max_limit="1500" 
router="sagemcom-fast-2804-v2" 
adress="192.168.1.1" 
user="admin" 
pass="admin" 

VAR=$(
expect -c " 
     set timeout 3 
     spawn telnet "$adress" 
     expect \"Login:\" 
     send \"$user\n\" 
     expect \"Password:\" 
     send \"$pass\n\" 
     expect \"commands.\" 
     send \"ping ya.ru -c $ping_count\n\" 
     set timeout 9 
     expect \"transmitted\" 
     send \"exit\" 
     ") 

count_ping=$(echo "$VAR" | grep packets | cut -c 1) 
avg_ms=$(echo "$VAR" | grep round-trip | cut -d '/' -f 4 | cut -d '.' -f 1) 

echo "1_____ping___$count_ping|||____$avg_ms" 
echo "$VAR" 
0

यहाँ कैसे/bash खोल में टेलनेट का उपयोग उम्मीद

#!/usr/bin/expect 
# just do a chmod 755 one the script 
# ./YOUR_SCRIPT_NAME.sh $YOUHOST $PORT 
# if you get "Escape character is '^]'" as the output it means got connected otherwise it has failed 

set ip [lindex $argv 0] 
set port [lindex $argv 1] 

set timeout 5 
spawn telnet $ip $port 
expect "'^]'." 
0
के बाद मेरे लिए काम कर रहा है

... डाल करने के लिए है अपने आने वाले सभी IP आप IP_sheet.txt

में टेलनेट करना चाहते हैं
while true 
read a 
do 
{ 
    sleep 3 
    echo df -kh 
    sleep 3 
    echo exit 
} | telnet $a 
done<IP_sheet.txt 
संबंधित मुद्दे