2011-03-08 12 views
7

मैंने इस साइट और कई अन्य स्थानों पर खोज की है लेकिन मैं एक आदेश के बाद एसएसएच सत्र को जोड़ने और बनाए रखने की अपनी समस्या को हल करने में असमर्थ हूं। नीचे मेरा वर्तमान कोड है:सिस्को राउटर के लिए लगातार एसएसएच सत्र

#!/opt/local/bin/python 

import os 

import pexpect 

import paramiko 

import hashlib 

import StringIO 

while True: 

     cisco_cmd = raw_input("Enter cisco router cmd:") 

     ssh = paramiko.SSHClient() 

     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

     ssh.connect('192.168.221.235', username='nuts', password='cisco', timeout = 30) 

     stdin, stdout, stderr = ssh.exec_command(cisco_cmd) 

     print stdout.read() 

     ssh.close() 

     if cisco_cmd == 'exit': break 

मैं एकाधिक आदेश चला सकता हूं लेकिन प्रत्येक आदेश के लिए एक नया एसएसएच सत्र बनाया जाता है। उपरोक्त प्रोग्राम काम नहीं करता है जब मुझे कॉन्फ़िगरेशन मोड की आवश्यकता होती है क्योंकि एसएसएच सत्र पुन: उपयोग नहीं किया जाता है। इस मामले को हल करने में किसी भी सहायता की बहुत सराहना की जाती है।

+0

मैं एक ऐसी स्क्रिप्ट से मोहक हूं जो दोनों pexpect और paramiko आयात करता है ... क्या आप एक बार में दोनों का उपयोग कर रहे हैं, या एक कोशिश करें और माइग्रेट करें? –

उत्तर

6

मैंने पैरामीको के बजाय एक्सस्क्रिप्ट का उपयोग किया और अब मैं आईओएस डिवाइस पर लगातार सत्र प्राप्त करने में सक्षम हूं।

#!/opt/local/bin/python 
import hashlib 
import Exscript 

from Exscript.util.interact import read_login 
from Exscript.protocols import SSH2 

account = read_login()    # Prompt the user for his name and password 
conn = SSH2()      # We choose to use SSH2 
conn.connect('192.168.221.235')  # Open the SSH connection 
conn.login(account)     # Authenticate on the remote host 
conn.execute('conf t')    # Execute the "uname -a" command 
conn.execute('interface Serial1/0') 
conn.execute('ip address 114.168.221.202 255.255.255.0') 
conn.execute('no shutdown') 
conn.execute('end') 
conn.execute('sh run int Serial1/0') 
print conn.response 

conn.execute('show ip route') 
print conn.response 

conn.send('exit\r')     # Send the "exit" command 
conn.close()      # Wait for the connection to close 
1

आपको लूप के बाहर कनेक्शन बनाने, कनेक्ट करने और बंद करने की आवश्यकता है।

1

आपका पाश है कि

ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect('192.168.221.235', username='nuts', password='cisco', timeout = 30) 
while True: 
     cisco_cmd = raw_input("Enter cisco router cmd:") 
     stdin, stdout, stderr = ssh.exec_command(cisco_cmd) 
     print stdout.read() 
     if cisco_cmd == 'exit': break 
ssh.close() 

ले जाएँ initialisation और पाश के बाहर सेटअप। संपादित करें: स्थानांतरित पास()

+1

'ssh.close()' लूप में भी नहीं होना चाहिए। –

+0

अच्छी जगह मैंने इसे याद किया –

+0

मैं पहले कमांड को कनेक्ट और सफलतापूर्वक चलाने में सक्षम हूं। मैं एक कनेक्शन स्थापित करने में असमर्थ रहा हूं जो एकाधिक संबंधित कमांडों के लिए जारी रहता है। – msudi

1

उपरोक्त कार्यक्रम क्योंकि ssh सत्र

पुनः उपयोग नहीं किया जब मैं विन्यास मोड की जरूरत काम नहीं करता है आपका ssh सत्र दोबारा इस्तेमाल किया जाएगा एक बार आप के लिए कदम लूप के बाहर connect और close, लेकिन प्रत्येक exec_command() एक नए खोल (एक नए चैनल के माध्यम से) में होता है, और असंबंधित होते हैं। आपको अपने आदेशों को प्रारूपित करने की आवश्यकता होगी ताकि उन्हें खोल से किसी भी राज्य की आवश्यकता न हो।

अगर मुझे सही याद है, तो कुछ सिस्को डिवाइस केवल एक ही निष्पादन की अनुमति देते हैं, और फिर कनेक्शन बंद करते हैं। उस स्थिति में, आपको invoke_shell() का उपयोग करने की आवश्यकता होगी, और pexpect मॉड्यूल (जिसे आपने पहले ही आयात किया है, लेकिन उपयोग नहीं कर रहे हैं) का उपयोग करके इंटरैक्टिव रूप से काम करना होगा।

+0

धन्यवाद, अभी भी avoke_shell() का कोई फायदा नहीं हुआ है। जब मैं अपनी समस्या को ठीक करता हूं तो मैं एक या दो दिन में रिपोर्ट करूंगा। – msudi

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