python-3.x .发送功能到cisco交换机不工作

juud5qan  于 2023-02-26  发布在  Python
关注(0)|答案(1)|浏览(130)

我有一个问题,下面的函数remote. send("show run int vlan 1\n")不起作用。下面的代码,它能够读取文件,创建一个新文件,并写入和保存文件。然而,输出只包含交换机名称,没有别的,有时它会显示交换机名称和命令的字符或2。输出如下所示
开关测试1
IP地址www.example.com1.1.1.51
测试1 _2023年2月23日
成功登录到test1
测试1编号
开关测试2
IP地址www.example.com1.1.1.50
测试2 _2023年2月23日
成功登录到test2
测试2编号
刚开始学这门语言,我不确定是什么问题。提前感谢你。

myfile = open('c:\znet\device-list.txt','r')

count = 0

while True:
    count = count + 1
    line = myfile.readline()
    if not line:break
    else:
        x = line.strip()
        y,z =x.split(",",1)
        print ("switch ",y)
        print ("IP address ",z)
        backupdate = str(date.today())
        filename = y + "_" + backupdate
        print (filename)
        host = z
        user = 'cisco'
        password = 'cisco'
        client = paramiko.SSHClient()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
        client.connect(hostname=host, username=user, password=password)
        print ("Successfully log in to", y)
        remote = client.invoke_shell()
        remote.send("show run int vlan 1\n")
        output = remote.recv(1048576)
        print (output.decode('ascii'))
        with open("{}.txt".format(filename),"w") as f:
            print (output.decode('ascii'),file=f)

我希望在终端和创建的文件中看到vlan 1的配置(show run int vlan 1)。

c2e8gylq

c2e8gylq1#

recv不会返回整个输出。它不能。您正在使用shell(invoke_shell)。shell是一个永不结束的间歇性数据流。唯一的结束是注销。也没有任何信号表明特定命令的完整输出已经结束。recv返回你调用它时可用的任何数据。如果你想要完整的输出,您需要反复调用recv,直到获得所有内容。
这就是为什么通常不应该使用invoke_shell进行命令自动化的原因之一。
参见What is the difference between exec_command and send with invoke_shell() on Paramiko?

相关问题