बैश स्क्रिप्ट का उपयोग करके टेलनेट सत्र को स्वचालित करना


80

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

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

# 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 समस्याओं का सामना कर रहा हूँ:

  1. रिमोट सिस्टम पर स्क्रिप्ट (मानव अंतःक्रिया के बिना) को कैसे निष्पादित किया जाए?

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

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

जवाबों:


77

एक 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 to you (Nice expect feature!)
interact

चलाने के लिए:

./myscript.expect name user password

2
'उम्मीद' ज्यादातर इंटरेक्टिव सत्रों के लिए है। मैं जो चाहता हूं वह एक स्वचालित गैर-संवादात्मक सत्र है। मैं जिस समस्या का सामना कर रहा हूं, वह यह है कि मैं रिमोट सिस्टम (टेलनेट के माध्यम से) स्क्रिप्ट्स को नहीं चला पा रहा हूं क्योंकि टेलनेट 10.1.1.1 के बाद की सभी लाइनें स्थानीय मशीन पर पहुंच जाती हैं, बजाय कि मैं जिस मशीन तक पहुंच रहा हूं।
खान

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

2
काफी उचित। मैं इस कार्य के लिए उम्मीद का उपयोग करूंगा।
खाना

1
एक और अच्छा जोड़ यह पढ़ने के लिए है - elenako.com/2013/04/04/… , बशर्ते स्क्रिप्ट में \rकमांड के अंत में अनुक्रम नहीं था , और जब मैंने खुद को दर्ज किया तो उसने किसी कारण से काम नहीं किया
llamerr

88

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

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
+1 sleepस्वप्न की तरह काम करता है ;-) मैंने | tee /dev/tty |स्क्रीन पर पूर्ण सत्र के बीच में भी जोड़ा है ;-)
paluh

1
मेरे मामले में, सबसे मददगार जवाब है, में, लेकिन मैं जोड़ने के लिए किया थाecho -e "command\r";
mf_

1
मैं गैर-अंतःक्रियात्मक रूप से टेलनेट को पासवर्ड कैसे प्रदान कर सकता हूं?
गेरिमिया

{ echo "remotecommand 1"; echo "remotecommand 2"; sleep 1; } | telnet 10.1.1.1 : यह उदाहरण मेरी आवश्यकताओं को पूरा करता है। बस यह जानना चाहते हैं कि अगर टेलनेट विफल हो जाता है और शेल स्क्रिप्ट चाहिए तो हम त्रुटि जांच कैसे जोड़ते हैं exit 1
यश

44

जब आप 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
सबसे उपयोगी टिप्पणी! यह वास्तव में आपको कमांड को लूप में डालकर स्वचालित करने की सुविधा देता है
रोमनएम

एक और मदद पोस्ट ब्लॉग। टोने
टोटके

वन-लाइनर समतुल्य { echo "GET / HTTP/1.1"; echo "Host: www.example.com"; echo; sleep 1; } | telnet www.example.com 80:। ध्यान दें कि नींद की शुरुआत में ज़रूरत नहीं है (जब तक कि आप खुली आज्ञा का उपयोग नहीं करते हैं) और यह कि 2 के बजाय केवल एक खाली प्रतिध्वनि और नींद 1 की आवश्यकता है।
बप्टेक्स

लेकिन अगर आपको HTTPS अनुरोध करने की आवश्यकता है, तो आपको netcat का उपयोग करना चाहिए, जिसे ncat या nc के रूप में भी जाना जाता है:{ echo "GET / HTTP/1.1"; echo "Host: example.com"; echo; sleep 1; } | ncat --ssl example.com 443
baptx

12

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

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

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. सुनिश्चित करें कि कमांड 'स्क्रीन-पर्ल' का उपयोग करके बैकग्राउड में कोई स्क्रीन नहीं चल रही है।
  2. स्क्रीन और इसके विकल्पों के बारे में अधिक पढ़ने के लिए http://www.gnu.org/software/screen/manual/screen.html#Stuff पढ़ें ।
  3. '-X' विकल्प के माध्यम से कमांड भेजने के लिए एक विशिष्ट विंडो के लिए नमूना_ script.sh preselects और reattaches में '-p' विकल्प अन्यथा आपको 'कोई स्क्रीन सत्र नहीं मिला' त्रुटि मिलती है।

2

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

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

2

निम्नलिखित मेरे लिए काम कर रहा है ... अपने सभी IP को IP_sheet.txt में टेलनेट करना चाहते हैं

while true
read a
do
{
    sleep 3
    echo df -kh
    sleep 3
    echo exit
} | telnet $a
done<IP_sheet.txt

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

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

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


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

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

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

यह उस प्रश्न का उत्तर नहीं है, जो विशेष रूप से कहता है कि '' कुछ टेलनेट संबंधी कार्यों को स्वचालित करना '' अपने मौजूदा लिपियों का उपयोग कर रहा है।
फ्रैक्टलस्पेस

0

यहां बताया गया है कि बैश शेल / अपेक्षा में टेलनेट का उपयोग कैसे किया जाता है

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

CISCO- सर्वर के संस्करण को प्राप्त करने के लिए स्क्रिप्ट:

#!/bin/sh

servers='
192.168.34.1
192.168.34.3
192.168.34.2
192.168.34.3
'
user='cisco_login'
pass='cisco_password'

show_version() {
host=$1
expect << EOF
set timeout 20
set host $host
set user $user
set pass $pass
spawn telnet $host
expect "Username:"
send "$user\r"
expect "Password:"
send "$pass\r"
expect -re ".*#"
send "show version\r"
expect -re ".*-More-.*"
send " "
expect -re ".*#"
send "exit\r"
EOF
}

for ip in $servers; do
  echo '---------------------------------------------'
  echo "$ip"
  show_version $ip | grep -A3 'SW Version'
done

-4

के साथ खेलते हैं 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**

9
नयापन अशिष्टता का कोई बहाना नहीं है। कृपया FAQ stackoverflow.com/faq देखें ।
वेर्बिया

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

7
यदि आप ऐसा कहते हैं - मैं एक गणितज्ञ प्रोग्रामर हूं तो आपके उत्तर और टिप्पणी का पदार्थ मेरे लिए एक रहस्य है। लेकिन मैं जानबूझकर अपमान करने के लिए "बेवकूफ" शब्द की व्याख्या करने वाला अकेला नहीं हूं। मुझे लगता है कि आपको साइट पर थोड़ा और समय बिताने की जरूरत है और देखें कि लोग यहां कैसे व्यवहार करते हैं।
वेर्बिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.