当前位置: 首页 > 知识库问答 >
问题:

python、paramiko、ssh异常ssh会话未激活

常炯
2023-03-14

我正在编写一个python脚本,该脚本发送到网络中的每台交换机,并发出一个copy running-config TFTP命令,备份交换机的运行配置。我在windows上使用Python2.7中的paramiko库。

脚本本身非常简单,它所做的只是创建一个名为“备份”的目录(如果还不存在的话),以及另一个名为“今天的日期”的目录,然后将该目录用于TFTP。并启动TFTP服务器。然后它只需通过SSH发出copy命令。

我试图克服的这个问题是在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/前一阵子好像已经下线了。

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

共有1个答案

洪高阳
2023-03-14

好吧,伙计们,我不知道为什么我会犯这些错误。但我确实在附近找到了一份工作。在使用connect创建SSHClient之后,您可以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"
 类似资料:
  • 问题内容: 我是python新手。我写了一个脚本来连接到主机并执行一个命令 当远程命令不需要tty时,可以正常工作。我找到了一个与Paramiko的invoke_shell示例嵌套SSH会话。我对这种解决方案不满意,因为如果服务器上的提示未在我的脚本中指定->无限循环,或者脚本中指定的提示是返回文本中的字符串->不会接收到所有数据。有没有更好的解决方案,也许将stdout和stderr像我的脚本一

  • 我是Python的新手。我编写了一个脚本连接到主机并执行一个命令

  • 问题内容: 我正在重写我在Python中编写的Bash脚本。该脚本的关键是 我在使用paramiko进行嵌套身份验证时遇到问题。我找不到适合我具体情况的任何示例,但是我能够在远程主机上找到带有 sudo的 示例。 第一种方法写入标准输入 第二个创建通道并使用类似于套接字的 send 和 recv 。 我能够使 stdin.write 与 sudo一起使用 ,但在远程主机上的 ssh 上却不起作用。

  • 我打算使用paramiko在远程主机上运行几个命令,但ssh会话在运行一个命令后关闭。 下面列出的代码: 那么有什么方法可以阻止ssh会话关闭吗?或者帕拉米科的替代品? 有什么方法可以让paramiko ssh会话一直处于活动状态吗? paramiko调试模式信息返回如下: 启动线程(客户端模式):0x2657E10L 已连接(版本1.99,客户端组件-5.20) kex ALGOS:[u'dif

  • 线程“main”java.lang.NoClassDeffounder中出现异常错误:org/apache/commons/io/input/NullinPutStream at main.main(main.java:6)原因:java.lang.ClassNotFoundexception:org.apache.commons.io.input.NullinPutStream at java.

  • 前面的详细信息 我需要在交换机上使用ssh来ping不同的主机。早些时候,我为每个主机启动了一个线程,但结果很容易超过了最大ssh连接数,所以我根据这个创建了一个交互式shell会话。但当我并行运行时,它在发出第一个命令后就一直挂在那里。我不知道如何修复此问题。 简化代码如下: