ssh异常ssh会话未激活

ssh异常ssh会话未激活

本文介绍了python,paramiko,ssh异常ssh会话未激活的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在研究一个python脚本,该脚本将转到我们网络中的每个交换机,并发出copy running-config TFTP命令副本,以备份该交换机的运行配置.我在Windows上并使用Python 2.7中的paramiko库.

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.

脚本本身非常简单,它所要做的就是创建一个名为"Backups"的目录(如果尚不存在)和另一个名为今天的日期"的目录,然后将该目录用于TFTP.然后启动TFTP服务器.然后,它只需通过ssh发出复制命令即可.

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.

我要解决的这个问题是在connectSwitch()期间.特别是在第二个ssh.exec_command('x.x.x.x')上.如果您不知道交换机,则发送副本running-config tftp是发送的第一个命令,交换机将请求一个主机,然后发送第二个命令,其中包含主机IP.第三个命令是您想要文件所在的目录.

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()

我的错误发生在下面的connectSwitch()已满.

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

任何人对此都有任何想法.我在paramiko中找不到关于错误文档的太多信息,因此,如果有人知道在哪里找到它,那就会滞后. net/paramiko/docs/似乎已经脱机了.

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.

,甚至使用 https://web.archive.org/web/20140425222451/http://www.lag.net/paramiko/docs/,这里似乎没有很多.

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

非常感谢你们!

将第一个"sendtoCRT"更改为不再包含:\,因为在执行此命令的三个步骤中不需要使用它.但是,这似乎也改变了我的错误

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/zh/1.15/api/ssh_exception.html

推荐答案

好的,你们没有弄清楚为什么我会收到这些错误.但是我确实找到了解决方法.创建SSHClient之后,使用connect可以调用Invoke_Shell,它会打开一个通道,该通道在通过它发送一些东西后不会关闭,这很棒.下面是我更新的connectSwitch代码,它利用了这种解决方法.

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"

这篇关于python,paramiko,ssh异常ssh会话未激活的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-28 04:26