平台工具:

  • 实验平台:WIN10
  • 使用工具:Evn-ng、python 3.6.8

实验拓扑:
注意:
书中使用了 192.168.2.0/24 ,我这里才有eve桥接的虚拟网段192.168.242.0/24来演示本次实验。
【SSH 服务端】LSW x,IP为 192.168.242.1x/24,连接到透明交换机SW1。

5、异常处理 - 图1

实验目的:

1、在生产环境中,交换机的管理 IP 基本不可能像实验环境中这样 11 到 15,有些交换机的管理 IP 甚至在不同的网段,这种情况下,我们就不能简单的用 for loop 来循环 IP 地址的最后一段来登录交换机。这里我们要额外开一个文本文件,把我们需要登录的交换机 IP 全部写进去,然后用 for loop 配合 open() 函数来批量登录所有交换机。(抄书的哈)
2、用上面的方法登录所有交换机,把华为交换机默认的 MSTP 修改成 STP。

实验准备:

LSW2 的 E0/0 进行 shutdown,模拟上联链路故障(拓扑端口也变红。)
5、异常处理 - 图2
LSW3 的用户 python 密码由 123 改为 456。
5、异常处理 - 图3
我们在实验4脚本基础上拿过来试跑一下,在 ip.txt 先剔除掉 LSW3 (192.168.242.13)的信息,针对性的观察断链了的 LSW2。

5、异常处理 - 图4

【实验4】脚本试跑结果,主要针对 LSW2 的不可达异常情况。

5、异常处理 - 图5
接着,我们把【实验4】脚本拿过来再试跑一下,在 ip.txt 先剔除掉 LSW2 (192.168.242.12)的信息,针对性的观察断链了的 LSW3。

5、异常处理 - 图6
【实验4】脚本试跑结果,主要针对 LSW3 的认证异常情况。

5、异常处理 - 图7

实验环境配置

按照拓扑,每台交换机 vlan 1 都配置 vlanif 的 IP 作为管理。(附 LSW1 的配置,如 LSW2 则仅为将 192.168.242.11 改为 192.168.242.12,这里从简。)

  1. 初始化
  2. 1.配置hostname domain-name
  3. hostname LSW1
  4. ip domain-name shiranit.com
  5. 2.产生密钥,产生1024位的密钥
  6. crypto key generate rsa general-keys modulus 1024
  7. 3.配置sssh的信息
  8. 会话超时时间
  9. ip ssh time-out 120
  10. 最大认证次数
  11. ip ssh authentication-retries 3
  12. 启用sshtelnet认证
  13. line vty 0 4
  14. transport input ssh telnet
  15. login local
  16. 4.本地认证用户
  17. enable passwod 123
  18. username python privilege 15 password 123
  19. PS: privilege 15这么设置是为了免去登陆时输入enable密码
  20. 5.配置管理地址
  21. interface Vlan 1
  22. ip address 192.168.242.11 255.255.255.0

更多精彩内容关注“释然IT杂谈”

Python 代码

代码讲解,大神在书里和专栏中已逐条做了解释

import paramiko
import time
import getpass
import sys
import socket

username = input("Username: ")
password = getpass.getpass("Password: ")
ip_file = sys.argv[1]
cmd_file = sys.argv[2]

# 存放认证失败的设备信息
switch_with_authentication_issue = []
# 存放网络不通的设备信息
switch_not_reachable = []

iplist = open(ip_file,'r')
for line in iplist.readlines():
    try:    
        ip = line.strip()
        ssh_client = paramiko.SSHClient()
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_client.connect(hostname=ip,username=username,
                           password=password,look_for_keys=False)
        print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')
        print('已经成功登陆交换机 ' + ip)
        command = ssh_client.invoke_shell()
        cmdlist = open(cmd_file,'r')
        cmdlist.seek(0)
        for line in cmdlist.readlines():
            each_command = line.strip()
            command.send(each_command + '\n')
            time.sleep(0.5)
        cmdlist.close()
        output = command.recv(65535).decode('ASCII')
        print(output)
    except paramiko.ssh_exception.AuthenticationException:
        print(ip + "用户验证失败!")
        switch_with_authentication_issue.append(ip)
    except socket.error:
        print(ip + "目标不可达!")
        switch_not_reachable.append(ip)

iplist.close()
ssh_client.close()

print('\n 下列交换机用户验证失败:')
for i in switch_with_authentication_issue:
    print(i)

print('\n 下列交换机不可达:')
for i in switch_not_reachable:
    print(i)

5、异常处理 - 图8

实验过程
我们把 ip.txt 列表倒回成所有网元 IP。
5、异常处理 - 图9
我们直接 运行过程截图如下。

5、异常处理 - 图10