Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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('\n'))   #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='\n'
    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:\Users\first.last\Documents\Backups\paramikoConnect.py", line 98, in <module> openIPs()
  File "C:\Users\first.last\Documents\Backups\paramikoConnect.py", line 32, in openIPs connectSwitch(UUser, UPass, item.strip('\n'))   #SSH connection to Switch
  File "C:\Users\first.last\Documents\Backups\paramikoConnect.py", line 68, in connectSwitch stdin, stdout, stderr = ssh.exec_command('138.86.51.189')
  File "C:\Python27\lib\site-packages\paramiko-1.15.2-py2.7.egg\paramiko\client.py", line 341, in exec_command chan = self._transport.open_session()
  File "C:\Python27\lib\site-packages\paramiko-1.15.2-py2.7.egg\paramiko\transport.py", line 615, in open_session max_packet_size=max_packet_size)
  File "C:\Python27\lib\site-packages\paramiko-1.15.2-py2.7.egg\paramiko\transport.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:\Users\first.last\Documents\Backups\paramikoConnect.py", line 98,in <module> openIPs()
  File "C:\Users\first.last\Documents\Backups\paramikoConnect.py", line 32, in openIPs connectSwitch(UUser, UPass, item.strip('\n'))   #SSH connection to Switch
  File "C:\Users\first.last\Documents\Backups\paramikoConnect.py", line 68, in connectSwitch stdin, stdout, stderr = ssh.exec_command('138.86.51.189')
  File "C:\Python27\lib\site-packages\paramiko-1.15.2-py2.7.egg\paramiko\client.py", line 341, in exec_command chan = self._transport.open_session()
  File "C:\Python27\lib\site-packages\paramiko-1.15.2-py2.7.egg\paramiko\transport.py", line 615, in open_session max_packet_size=max_packet_size)
  File "C:\Python27\lib\site-packages\paramiko-1.15.2-py2.7.egg\paramiko\transport.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

like image 477
user2833297 Avatar asked Jul 17 '15 13:07

user2833297


1 Answers

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 "\n\nNewInvoke Shell\n"

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

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

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


    chan.send('Backups/'+filename+'/'+Host+'\n')
    time.sleep(3)
    resp = chan.recv(9999)
    print resp
    print"\nEnd invoke Shell\n\n"
like image 83
user2833297 Avatar answered Sep 18 '22 04:09

user2833297