Python-交换机自动配置脚本2.0版本
  CTN93lCkMKtO 2023年12月06日 31 0

主要代码实现目的跟之前的 1.0版本 是一样的,都是为了批量处理交换机的简单基础的命令,例如基本简单的 vlan创建 设备配置备份 创建新用户 等一些基本且每台都需要配置的操作。 本次代码更新主要是为了解决 1.0版本 设备IP不连续的问题,这里的是创建一个 ip_list 的文档进行调用,根据 ip_list 的IP进行逐行的调用登录,直到文本的最后一行。

代码分段解释:

调用对应的python 模块,定义username,password留作后续的调用。在代码存放的相同路径下,创建一个 ip_list.txt 的文件,存放对应需要批量配置的 IP 即可,一行一个IP就行。 如图所示:切忌文本内不要有多余的空行,不然会运行报错的。 图片.png


import paramiko
import time
import sys
import socket

  #输入用户名和密码
username = 'zhangsan'
password = 'abc123456'
 #在脚本同目录下,创建一个ip_list的文档,一行一个ip地址
f = open("ip_list.txt","r")
for line in f.readlines():
    ip = line.strip()

代码分段解释:

这里是配置 paramiko 模块中的 ssh功能,并调用之前预设的username,password信息。这里的 command.send(xxxx)括号内的内容就是向设备发送的命令,结尾的 \n 的意思是说换行,不然的话这些命令全都为一行进行输入了,这里面的内容可以根据你自己对于脚本的要求进行输入。最后一行的 time.sleep(20)是这些命令输入完成后强制等待20秒钟的回显内容,这里看命令来定吧,时间太短可能会导致命令还没有输完这个连接就已经中断了,为了确保命令输入完成,最好设置等待时间。 这段是我们所需要的核心内容,这里的命令你可以根据你的实际情况进行自定义,这里写的ACL创建,你改成 dis cu 就是设备备份。

     #调用ssh登录服务,并指定用户密码等信息
    try:
        ssh_client = paramiko.SSHClient()
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_client.connect(hostname=ip,username=username,password=password)
        #捕捉异常,出现常规异常就会输出 登录异常 IP 。
    except Exception as e :
        print('登录异常:ip: %s', ip+e)
        continue

    print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')
    print  ( "Successfully connect to ", ip)

    command = ssh_client.invoke_shell()
    command.send('screen-length 0 temporary\n')
    # 关闭回显分屏功能
    command.send('sys \n')
    command.send('acl 3000 \n')
    command.send('dis this \n')
    command.send('des acc_SW  \n')
    command.send(' rule 1 permit ip source 10.200.1.20 0 \n')
    command.send(' rule 2 permit ip source 10.200.1.2 0 \n')
    command.send(' rule 3 permit ip source 10.10.19.251 0 \n')
    command.send(' rule 4 permit ip source 10.10.18.139 0 \n')
    command.send(' rule 50 deny ip \n')
    command.send('com  \n')
    command.send('q \n')
    command.send('user-int vty 0 4   \n')
    command.send('acl 3000 in  \n')
    command.send('q \n')
    command.send('q \n')
    command.send('save \n')
    command.send('y \n')
    command.send('q \n')
    time.sleep(20)

代码分段解释:

这里是定义了一个 f 值,然后执行一个打开 ip_list 的动作,打开文本后的权限只有 只读 ,然后会根据 ip_list 文本内的ip 进行逐行匹配,然后根据提取的IP进行对,对应输出的文件进行命名。 也根据大佬的优化新增了一个删除多余空行,来实现更好的可读性。

 #生成的文件。回显并输入到脚本目录下的result文件夹内。
    output = command.recv(65535).decode('accsi')
    print(output)


    f1 = open(f".\\result\\{ip}logo.txt","w")
    f1.write(output)
    f.close()
#关闭 ssh 的连接,
    ssh_client.close

    f1 = open(f".\\result\\{ip}logo.txt","r")
    f2 = open(f".\\nanshan\\{ip}_new_logo.txt","w")
    for line in f1.readlines():
        if line.split():
            f2.write(line)
    f1.close()
    f2.close()

完整代码:

这里代码可以直接复制过去使用


import paramiko
import time
import sys
import socket

  #输入用户名和密码
username = 'zhangsan'
password = 'abc123456'
 #在脚本同目录下,创建一个ip_list的文档,一行一个ip地址
f = open("ip_list.txt","r")
for line in f.readlines():
    ip = line.strip()
     #调用ssh登录服务,并指定用户密码等信息
    try:
        ssh_client = paramiko.SSHClient()
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_client.connect(hostname=ip,username=username,password=password)
        #捕捉异常,出现常规异常就会输出 登录异常 IP 。
    except Exception as e :
        print('登录异常:ip: %s', ip+e)
        continue

    print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')
    print  ( "Successfully connect to ", ip)

    command = ssh_client.invoke_shell()
    command.send('screen-length 0 temporary\n')
    # 关闭回显分屏功能
    command.send('sys \n')
    command.send('acl 3000 \n')
    command.send('dis this \n')
    command.send('des acc_SW  \n')
    command.send(' rule 1 permit ip source 10.200.1.20 0 \n')
    command.send(' rule 2 permit ip source 10.200.1.2 0 \n')
    command.send(' rule 3 permit ip source 10.10.19.251 0 \n')
    command.send(' rule 50 deny ip \n')
    command.send('com  \n')
    command.send('q \n')
    command.send('user-int vty 0 4   \n')
    command.send('acl 3000 in  \n')
    command.send('q \n')
    command.send('q \n')
    command.send('save \n')
    command.send('y \n')
    command.send('q \n')
    time.sleep(20)

    #生成的文件。回显并输入到脚本目录下的result文件夹内。
    output = command.recv(65535).decode('accsi')
    print(output)


    f1 = open(f".\\result\\{ip}logo.txt","w")
    f1.write(output)
    f.close()
#关闭 ssh 的连接,
    ssh_client.close

    f1 = open(f".\\result\\{ip}logo.txt","r")
    f2 = open(f".\\nanshan\\{ip}_new_logo.txt","w")
    for line in f1.readlines():
        if line.split():
            f2.write(line)
    f1.close()
    f2.close()


代码存在问题:

1、使用于所有设备正常可访问,若出现异常报错(例如设备IP不可达,设备用户名密码错误等),代码会中止运行。 2、每次配置脚本不一样的话需要手动修改代码的内容,若是像我这样不是很懂python的朋友,可能会误删除代码内容,导致最终的运行报错。 3、设备和命令都需要一步步的登录,若设备数量较多,等待配置时间会很长。因为代码内容是一行行的运行,一行行的去执行。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月06日 0

暂无评论

推荐阅读
  9JCEeX0Eg8g4   2023年11月25日   37   0   0 ednpython
  6tuRdFP5lxfF   2023年11月22日   32   0   0 python日志记录