Python, Paramiko, SSH异常:SSH会话未激活

6

我正在编写一个Python脚本,该脚本会去访问我们网络中的每个交换机,并发出复制运行配置TFTP命令,备份交换机的运行配置。我使用Python 2.7中的paramiko库,并在Windows上工作。

这个脚本很简单,它只是创建一个名为“Backups”的目录(如果不存在),另外再创建一个以当天日期命名的目录,并将该目录用于TFTP。然后启动TFTP服务器并通过ssh简单地发出复制命令。

我正在尝试解决的问题是在connectSwitch()函数中。具体来说是在第二个ssh.exec_command('x.x.x.x')命令中。如果您不了解交换机,copy running-config tftp是第一个发送的命令,交换机会要求输入主机名称,接着发出包含主机IP的第二个命令,然后是您想要文件存放的目录的第三个命令。

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()函数中,如下所示。

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的错误文档中找不到太多信息,所以如果有人知道在哪里可以找到它,lag.net/paramiko/docs/ 似乎已经下线了一段时间。

但即使使用 https://web.archive.org/web/20140425222451/http://www.lag.net/paramiko/docs/,这里似乎也没有太多内容。

非常感谢大家!

编辑:将第一个“sendtoCRT”更改为不再包含:\,因为在执行三个步骤的命令时不需要它。然而,这似乎也改变了我的错误。

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

此外,我找到了更多文档。

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

1个回答

10

大家好,我没有弄清为什么会出现这些错误,但我找到了一个解决办法。在创建SSHClient并使用connect后,可以调用Invoke_Shell函数来打开一个通道,在向通道发送信息后它不会自动关闭,非常方便。下面是我的更新后的connectSwitch代码,使用了这个解决办法。

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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接