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
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"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With