Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.1k views
in Technique[技术] by (71.8m points)

networking - python, paramiko, ssh exception ssh session not active

I'm working on a python script that goes to each switch in our network, and issues a copy running-config TFTP command, that backs up the running configuration of the switch. I'm on windows and utilizing the paramiko library in Python 2.7.

The script itself is pretty simple, all it does is create a directory called "Backups" if one doesn't exist already, and another directory named today's date, and then uses that directory for the TFTP. And it starts up the TFTP Server. Then it simply issues the copy command via ssh.

This issue I am trying to overcome is during connectSwitch(). Specifically on the second ssh.exec_command('x.x.x.x'). If you don't know switches, the copy running-config tftp, is the first command sent, the switch asks for a host, and the second command is sent, that contains the host IP. And the third command is the directory where you want the file to be located.

import paramiko
import getpass
import os
import time
from datetime import date

paramiko.util.log_to_file("filename.log")

d = date.today()
filename = d.strftime("%Y.%m.%d")

UUser = "first.last"
print UUser
UPass = getpass.getpass('Enter your Password: ')

def writeFile(text, Host):#Writes to the Switches backup File
    fl = open(Host+".txt", 'w')
    fl.write(text)

def openIPs():#Opens the "IPs" file
    fi = open('IPs.txt', 'r')
    content = fi.readlines()
    fi.close()
    print len(content)
    makeDirBackUp()     #Creates "Backup" Dir
    makeDir()           #Creates a Directory based and named on todays date
    for item in content:
        response = os.system("ping -n 1 " +item)
        if response == 0:
            print  item + "PING STATUS: SUCCESS"
            print "BACKING UP CONFIG..."
            connectSwitch(UUser, UPass, item.strip('
'))   #SSH connection to Switch
        else:
        print item + "PING STATUS: FAIL"

def makeDir():#Creates a Directory based and named on todays date
    if not os.path.exists(filename):
        os.makedirs(filename)
    os.chdir(filename)

def makeDirBackUp():#Creates "Backup" Dir
    if not os.path.exists("Backups"):
        os.makedirs("Backups")
    os.chdir("Backups")

def connectSwitch(UUser, UPass, Host):#SSH connection to Switch
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(Host, port=22, username=UUser, password=UPass)
    print "Command #1"
    sendtoCRT = 'copy running-config tftp'

    stdin, stdout, stderr = ssh.exec_command(sendtoCRT)
    print "Command #1 sent"
    print sendtoCRT
    time.sleep(1)
    print "readlines for Command #1"


    print "Command #2"
    stdin, stdout, stderr = ssh.exec_command('10.10.10.10')
    time.sleep(1)
    print "Command #2 Sent"

    print "Command #3"
    stdin, stdout, stderr = ssh.exec_command('Backups/'+filename+'/'+Host)
    time.sleep(1)
    print "Command #3 Sent"



def startTFTP():
    sendToOS="tftpd32.exe"
    exe1 = os.system(sendToOS)
    sendToOS='
'
    exe = os.system(sendToOS)
    exe = os.system(sendToOS)

startTFTP()
openIPs()

My error is occurring in connectSwitch() is in full, below.

Traceback (most recent call last):
  File "C:Usersfirst.lastDocumentsBackupsparamikoConnect.py", line 98, in <module> openIPs()
  File "C:Usersfirst.lastDocumentsBackupsparamikoConnect.py", line 32, in openIPs connectSwitch(UUser, UPass, item.strip('
'))   #SSH connection to Switch
  File "C:Usersfirst.lastDocumentsBackupsparamikoConnect.py", line 68, in connectSwitch stdin, stdout, stderr = ssh.exec_command('138.86.51.189')
  File "C:Python27libsite-packagesparamiko-1.15.2-py2.7.eggparamikoclient.py", line 341, in exec_command chan = self._transport.open_session()
  File "C:Python27libsite-packagesparamiko-1.15.2-py2.7.eggparamikoransport.py", line 615, in open_session max_packet_size=max_packet_size)
  File "C:Python27libsite-packagesparamiko-1.15.2-py2.7.eggparamikoransport.py", line 696, in open_channel raise SSHException('SSH session not active')
paramiko.ssh_exception.SSHException: SSH session not active

Anyone have any ideas about this. I can't find much about the error documentation in paramiko, so if someone knows where to find it, lag. net/paramiko/docs/ seems to have been taken offline a while ago.

but even using https://web.archive.org/web/20140425222451/http://www.lag.net/paramiko/docs/, there doesn't seem to be much here.

Thanks so much you guys!

EDIT: Changed the first "sendtoCRT" to no longer include the :, because you don't need it when doing the command in three steps. However this also seemingly changed my error

Traceback (most recent call last):
  File "C:Usersfirst.lastDocumentsBackupsparamikoConnect.py", line 98,in <module> openIPs()
  File "C:Usersfirst.lastDocumentsBackupsparamikoConnect.py", line 32, in openIPs connectSwitch(UUser, UPass, item.strip('
'))   #SSH connection to Switch
  File "C:Usersfirst.lastDocumentsBackupsparamikoConnect.py", line 68, in connectSwitch stdin, stdout, stderr = ssh.exec_command('138.86.51.189')
  File "C:Python27libsite-packagesparamiko-1.15.2-py2.7.eggparamikoclient.py", line 341, in exec_command chan = self._transport.open_session()
  File "C:Python27libsite-packagesparamiko-1.15.2-py2.7.eggparamikoransport.py", line 615, in open_session max_packet_size=max_packet_size)
  File "C:Python27libsite-packagesparamiko-1.15.2-py2.7.eggparamikoransport.py", line 740, in open_channel raise e
paramiko.ssh_exception.ChannelException: (4, 'Resource shortage')

Also I found more docs.

http://docs.paramiko.org/en/1.15/api/ssh_exception.html

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Alright you guys, I didn't firgure out why I was getting these errors. But I did find a work around. After creating the SSHClient, using connect, you can can Invoke_Shell, and it opens a channel, that it doesn't close after you send something through it, which is great. Below is my updated connectSwitch code, that utilizes this work around.

def connectSwitch(UUser, UPass, Host):#SSH connection to Switch
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(Host, port=22, username=UUser, password=UPass)
    print "

NewInvoke Shell
"

    chan = ssh.invoke_shell()
    resp = chan.recv(9999)
    print resp

    print chan.send_ready()
    chan.send('copy running-config tftp
')
    time.sleep(3)
    resp = chan.recv(9999)
    print resp

    chan.send('138.86.51.189
')
    time.sleep(3)
    resp = chan.recv(9999)
    print resp


    chan.send('Backups/'+filename+'/'+Host+'
')
    time.sleep(3)
    resp = chan.recv(9999)
    print resp
    print"
End invoke Shell

"

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...