精华内容
下载资源
问答
  • 下列网络设备中,能够抑制网络风暴的是( ) Ⅰ.中继器 Ⅱ.集线器 Ⅲ.网桥 Ⅳ.路由器 A.仅Ⅰ和Ⅱ B.仅Ⅲ C.仅Ⅲ和Ⅳ D.仅Ⅳ 正确答案 C 答案解析 [解析] 考查网络设备与网络风暴。 广播域是指网段上所有设备的...

    下列网络设备中,能够抑制网络风暴的是( )
    Ⅰ.中继器 Ⅱ.集线器 Ⅲ.网桥 Ⅳ.路由器

    A.仅Ⅰ和Ⅱ
    B.仅Ⅲ
    C.仅Ⅲ和Ⅳ
    D.仅Ⅳ

    正确答案
    C

    答案解析
    [解析] 考查网络设备与网络风暴。
    广播域是指网段上所有设备的集合。这些设备收听送往那个网段的所有广播。
    [*]
    冲突域:在同一个冲突域中的每一个节点都能收到所有被发送的帧;
    冲突域是基于第一层(物理层);
    广播域是基于第二层(链路层);
    中继器和集线器属于第一层设备,所以分割不了冲突域;物理层设备中继器和集线器既不隔离冲突域也不隔离广播域;
    交换机和网桥属于第二层设备,所以能分割冲突域;网桥可隔离冲突域,但不隔离广播域;
    路由器属于第三层设备,所以既能分割冲突域又能分割广播域。
    VLAN(即虚拟局域网)也可隔离广播域。
    对于不隔离广播域的设备,它们互连的不同网络都属于同一个广播域,因此扩大了广播域的范围,更容易产生网络风暴。

    转载于:https://www.cnblogs.com/benjaminfee/p/10195802.html

    展开全文
  • 设置访问网络设备特权模式口令 cisco>enable cisco#config terminal cisco(config)#enable password 密码 enable password存在的问题是它将口令以可阅读文本的形式储存在 running-config和startup-config中 ...

    一.进入 特权模式 密码
    设置访问网络设备特权模式口令
    cisco>enable
    cisco#config terminal
    cisco(config)#enable password 密码

    enable password存在的问题是它将口令以可阅读文本的形式储存在 running-config和startup-config中

    特别说明:
    Router(config)#enable password ?

         7          Specifies a HIDDEN password will follow

        LINE     The UNENCRYPTED (cleartext) 'enable' password

        level      Set exec level password


    7

            是思科自有的加密协议type7,比较简单,容易破解,这里的用法是  enable password 7  ……
    后面是加入密文才有效。这个密文通常要在以前备份的配置里拷贝才行,用于配置恢复时使用。
    比如你设置enable password cisco
    然后使用service password-encryption命令开启加密
    在show running-config里面能够看到enable password 7 104D000A0618
    104D000A0618这个值你就可以直接写在enable password 7后面,实际就是cisco密文加密的结果

     

    LINE

            直接输入密码,不加密,明文显示
     

    level   (后面讲)
             设置用户级别密码 指定密码作用于哪个级别(实际操作中会将密码加密保存)
              共15个等级  最低为1   最高为15(相当于root权限)
              进入对应的级别输入 相应的密码 
              如:Router>enable 5   (此时应输入5级密码)

     

    在网络设备中,默认情况下,除了使能加密口令外,其它所有口令都以明文格式储存在startup-config 和 running-config中。使用 service password-encryption 命令后,所有系统口令都将以加密形式存储。

    加密系统所有口令
    cisco(config)# service password-encryption 
    加密的方式是cisco私有加密方式


    取消系统口令加密
    cisco(config)# no service password-encryption 
    取消加密不会将已加密的口令恢复为可阅读文本,但是新设置的密码将会以明文存在


    二.使能密码

            思科引入新的口令控制特权模式访问,即加密口令,使能密码
    设置访问网络设备特权模式加密口令
    cisco>enable
    cisco#config terminal
    cisco(config)#enable secret 密码
    采用了MD5加密,如果配置了加密口令,则不在使用未加密口令,两种口令不能并列使用

             

     特别说明:
          
    Router(config)#enable secret ?

            0      Specifies an UNENCRYPTED password will follow

            5      Specifies an ENCRYPTED secret will follow

           LINE The UNENCRYPTED (cleartext) 'enable' secret

           level   Set exec level password


           其实对于Secret 选项来说,密码肯定是会被加密的。
           假设我要设置的密码为cisco


         0 是指:我现在即将输入的密码是原始密码,是:cisco
         5 是指:就是输入cisco 的MD5值:$1$XNRo$8FSa/XSF9DbmF6VbK6L6K
         level   :    设置用户级别密码 指定密码作用于哪个级别

     

     

    三.控制台登录密码

    配置console 访问密码

    cisco>enable
    cisco# config terminal
    cisco(config)# line console 0            切换为控制台0号 线路配置模式
    cisco(config)# password  密码           设置密码
    cisco(config)# login               将控制台线路设置为登陆需要输入口令 才能访问(否则即使设置密码也不需要输入)

    四.辅助线路

    配置vty访问密码

    cisco>enable
    cisco#config terminal
    cisco(config)#line aux 0             对aux0号 线路进行配置
    cisco(config)#password 密码     设置密码
    cisco(config)#login                   将控制台线路设置为登陆需要输入口令 才能访问(否则即使设置密码也不需要输入)

    五.虚拟终端线路(vty 同步)(tty异步) telnet  ssh

    配置vty访问密码

    cisco>enable
    cisco#config terminal
    cisco(config)#line vty 0 15 对vty0到15号 线路进行配置(最大允许16个人同时登陆,VTY线路的编号)
    cisco(config)#password 密码 设置密码
    cisco(config)#login       将控制台线路设置为登陆需要输入口令 才能访问(否则即使设置密码也不需要输入)
                                             

     

    特别说明:
       
    Router(config-line)#login ?

            authentication    authenticate using aaa method list

              local Local       password checking

       authentication    配置Telnet口登录进行AAA认证(后面讲)

     

       local        如果设置 local 则指明使用本地数据库进行身份验证,将要输入 用户名 和 密码
                      首先必须要用username xxx  password xxx命令
                      来创建你的用户并且给你的用户设置密码

     

            特别说明,在默认情况下,除了password secret外,所有cisco密码都以明文形式,存贮在路由器的配置,这些密码通过 show running-config命令来查看。这是非常不安全的行为。

            为提高密码安全性,可进行如下配置。

    1.设置最短密码长度
          cisco IOS 12.3 以后的版本,可以利用命令
          security passwords min-length 长度   
          
    设置0~16位的最短字符长度,启用后,user passwords、enable secret、line passwords、都会遵循此设置

     

    2.禁用无用连接
        在线路配置模式下,使用
        Router(config-line)#exec-timeout  时间
        该命令来控制管理接口连接时间,

     

    3.加密配置文件中的所有密码
         加密系统所有口令
         cisco(config)# service password-encryption 
        加密的方式是cisco私有加密方式,是一种可逆的加密,建议使用与enable 不同的密码


        取消系统口令加密
        cisco(config)# no service password-encryption 
        取消加密不会将已加密的口令恢复为可阅读文本,但是新设置的密码将会以明文存在

      

    4.使用本地数据库中的用户和密码执行登陆验证,有两种配置方式
          Router(config)# username 用户名  passwords 密码
          Router(config)# username 用户名 secret  密码   (用md5加密,安全性更高)

         然后在线路配置中,启用本地登陆验证
         Router(config-line)#login local

     

    5.其它的登陆安全措施

    R1(config)#login block-for 60 attempts 3 within 30
                                        //30s内连续登录失败3次后,等待60s(进入安静期)后才能再次登录
    R1(config)#login quiet-mode access-class 10  
                                           //安静期内ACL10指定的计算机仍可以远程访问本路由器
    R1(config)#login delay 2                 //登录成功后有2s延迟,即2s后才能再次登录
    R1(config)#login on-failure log        //登录失败会在日志中记录
    R1(config)#login on-success log        //登录成功会在日志中记录
    R1(config)#security authentication failure rate 5 log
                                      //连续登录失败5次后,默认等待15s后才能再次登录,并会产生日志,IOS12.3(1)
     验证配置可以使用  show login 

     

    6.设置标语
        

    配置旗标消息:

    R1(config)#banner motd @        @        //每日报告旗标(MOTD Message-of-the-day banner)   连接时

    R1(config)#banner login@        @        //登录旗标          登录前

    R1(config)#banner exec @        @        //EXEC旗标      登陆后

    R1(config)#banner incoming@        @        //传入旗标 
                                                                    在与反向Telnet线路连接的终端上显示,该旗标有助于向用户提供指令;

    R1(config)#banner slip-ppp@        @        //SLIP-PPP旗标

                           常用于兼容非Cisco系列线路Internet协议(如:SLIP和PPP拨号软件连接中),如果使用默
                                   认旗标,会导致连接问题。

     

     

     

     

     

    用户级别控制:

     

    Cisco IOS提供从0到15的16个优先权等级:

    ①默认情况下IOS有3个预定义的用户等级,分别为:

        优先权等级0:包括disable、enable、exit、help和logout命令;

        优先权等级1:User EXEC mode,即用户模式(R1>)的所有用户级命令;

        优先权等级15:Privileged EXEC mode(启用模式),包括R1#提示的所有启动级命令。


             ②2至14等级用于用户自定义的模式;
                          cisco(config)# enable secret level  级别 密码
                                                          
    设置从用户模式进入各级别 特权模式的密码
                            R1(config)# username user3 privilege 5 secret 密码
                                                          
    创建优先权等级5的user3用户

     

    ③ R1(config)# privilege mode level 级别 命令
                      命令可以更改、移动或设置上述任一级别的命令优先权,

              mode:是指路由器上的不同模式
                                    cisco(config)#privilege ?

                                           configure      Global configuration mode

                                           exec             Exec mode

                                           interface      Interface configuration mode

                                           line               Line configuration mode

                                           router           Router configuration mode

        示例:          R1(config)#privilege configure level 5 interface  
                                       //移动等级15的“interface”命令到等级5
                                      R1(config)#privilege configure level 5 ping
                                            //等级5及以上才可以使用  ping 命令

                        

     

    ④“R1(config-line)#privilege level level              命令可以修改给定线路的优先权等级。

        示例:R1(config)#line vty 3 4 

              R1(config-line)#privilege level 1        //修改VTY线路3-4的默认优先权等级为1

               使用  show privilege  命令显示当前级别 

     

     

    AAA认证:
     
    一、简介
            AAA是Authentication(认证)Authorization授权 Account记帐的简称;
            它们不是必须的也不是要同时一起使用的;
            他们可以使用路由器设备本地数据库,也可以使用外部数据库(ACS);
                    首先我们要认证,即通过密码验证;我们就算没有设置其实也用到了认证,就是登陆路由器要输入的密码,
            这个叫enable
             我们在配置了,username abc password aaa 
                                         username abc secret password
                    
    使用这个帐号的话,叫local;
             这二种是本地的数据库。
             
    如果要用到认证服务器,如 tacacs+ radius 就属于group 服务器组方式了,这时你必须要在tacacs+ radius中选一个,同时还最多可选三个其它的认证方式;当然如果你对你的服务器和网络环境有信心的话可以不选。 

    二、配置教程
    1、使用它们都是三个步骤
      1、建立帐户数据库(本地或认证服务器);
      2、定义列表;
      3、应用到接口和链路;
    2、首先我们要启用AAA功能 
      Router(config)# aaa new-model

    3、一般来说第二步定义一个本地数据库防止配置失误造成无法登陆
      Router(config)# Username abc password aaa

    4、定义认证配置
      认证相当于在问你是谁,你要回答我是哪个;但不可能不停的在问就算不烦嗓子也疼啊,只有在进门时我会问下你是谁,开保险柜时我在问下你是谁,或者是检查指纹测试瞳孔什么的等等;所以我们要对动作进行认证定义。
       Router(config)#aaa authentication  行为 列表名 认证方法
         行为主要有以下三种:
       aaa authentication login ――――――当有一个登陆行为时进行认证;
       aaa authentication ppp ――――――对基于PPP协议的一些网络应用进行认证;
       aaa authentication enable ――――――对使用enable命令进入特权模式时进行认证;
            列表名是自己定义的,这样我们可以把各种认证方式互相组合保存成一个个列表,用的时候方便,修改起来也方便,我改了一个列表里的认证方式那么所有使用这个列表的地方都改了,不需要去一个个地方去改了。
      Dedautl列表是一个系统自己建立的列表名作为缺省列表。它与我们自己建的列表没有任何区别,只不过他是系统建的而已。
    3、认证方法,就是指我们是查口令呢还是看指纹还是其它等等,也就是把我们的回答和谁进行分析比较。主要有以
      下几种:


    关键字

    描述
    enable使用enabel口令认证;
    krb5使用Kerberos5来认证;
    line使用线路口令来认证;
    local使用本地用户数据库来认证;
    none不认证;
    group radius使用radius服务器来认证;
    group tacacs+使用tacacs+服务器来认证;

     local-case           使用本地验证(对大小写敏感)


    每个列表中必须定义一种认证方法,最多可以定义四种方法,当第一种认证不通过再使用第二种,以此类推。 
    例如我们定义
    Router(config)# aaa authentication login 二号方案 group tacacs+ local
    //我们定义了一个名叫二号方案认证方式,就是先去tacacs+服务器验证,如果不成功在试试用本地帐号来试;
    Router(config)# aaa authentication login 三号方案 group local enable
    //我们定义了一个名叫三号方案认证方式,就是先用本地帐号验证,如果不成功就用enable密码来验证;

    五、应用到接口和链路
    我们上面做了那么多但是还没有效果为什么呢,就好像我们做好了报警器,指纹验证器但没装到门上你说可有效果,那当然是不行的了,我们是定义了当登陆时就启用一个列表名字叫二号方案的认证方式,但只有我们把他装到门上才能有效果啊,有人说太麻烦应该定义好了就能用,那就惨了,你给自己家的门上装了二号方案没关系,如果楼道门、院子门,都给装上了那就有问题了,所以我们要把定义好的认证方法列表装到我们需要使用认证的门上,例如我们可能对Telnet要认证,但通过console登陆的就不要认证。
    Router(config)# line vty 0 //我们先要进入接口
    Router(config-line)# aaa authentication 二号方案   //线路vty0使用名为二号方案的方式进行认证;
    或者:
    Router(config)# line vty 1
    Router(config-line)# login  authentication 三号方案


     

    aaa的一些其他命令:
        锁死失败超过限制的账号
       Router(config)# aaa local authentication at tempts max-fail 失败次数

     
    显示所有被锁死的用户
      Router# show aaa local user lockout 

      
    解除锁定
      Router(config)# clear aaa local user lockout {username 用户名| all}

     只显示aaa认证授权的用户
     Router# show aaa  user  {all | 唯一id}

     显示一个会话的唯一id
     Router# show aaa  sessions 
       

     

    AAA授权:

    配置供用户通过认证之后的AAA授权
         aaa authorization 命令
         aaa authorization {network | exec | commands level | reverse-access | configuration} {default
    |list-name}  method1 [method2~~~]
         network 为所有网络相关的服务请求进行授权,包括SLIP,PPP,PPP NCP和ARA
         exec      使用授权,以确定是否用户可以运行一个EXEC shell.
         commands 为所有处于规定的特权级别的命令使用授权
         level     规定应该被授权的命令级别,有效值 0-15
         reverse-access   为反向访问连接使用授权,例如反向Telnet
         configuration   从AAA服务器上下载配置

         default         使用此变量后列出的认证方法,作为缺省方法列表供认证
         listname        用来命令认证方法列表的字符串

         method 规定以下关键字的至少一种
           group 用radius或tacacs+服务器的一个子集来认证,这些服务器定义在aaa group server radius
    或aaa group server tacacs+命令中
           if-authenticated   如果用户为认证,允许用户访问请求的功能;
           krb5-instance      使用被kerberos instance map命令定义的实例;
           local              用本地用户名数据库来授权
           none                不用授权
    例子:
         enable secret level 1 ***    为级别1的用户建立一个enable secret口令
         enable secret level 15 ***    为级别15的用户建立一个enable secret口令
         aaa new-model   启用AAA
         aaa authentication login default enable     将enable口令作为缺省的登入方式
         aaa authentication login console-in group tacacs+ local     无论何时使用名为console-in的列
    表,都使用TACACS+认证,如果TACACS+认证失败,己用本地用户名和口令
         aaa authentication login dial-in group tacacs+    无论何时使用名为dial-in的列表,都使用
    TACACS+认证.
         username *** password ****         建立一个本地用户名和口令,最可能与console-in登录方法列
    表一起使用
         aaa authorization commands 1 alpha local    用本地用户名数据库来为所有级别1命令的使用进行
    授权  www.2cto.com  
         aaa authorization commands 15 bravo if-authenticated group tacplus local   如果用户已经认
    证了,让其运行级别15的命令,如果还未认证,在允许其访问级别15的命令之前,必须基于tacplus组中的
    TACACS+服务器来认证
         aaa authorization network charlie local none   使用本地数据库来对所有网络服务的使用授权,
    如果本地服务器不可用,此命令执行并不授权,用户能使用所有的网络服务
         aaa authorization exec delta if-authenticated group tacplus    如果用户已经认证,让其运行
    EXEC过程,如果没有认证,在允许EXEC之前,必须基于tacplus组中的TACACS+服务器来认证
         privilege exec level 1 ping   为级别1的用户启用PING
         line console 0 
         login authentication console-in   使用console-in列表作为控制台端口0的登录认证
         line s3/0
         ppp authentication chap dial-in   使用dial-in列表作接口S3/0 的PPP CHAP的登录认证

     

     

    AAA记账:

    配置规定如何写记帐记录的AAA记帐
         aaa accounting [auth-proxy |system |network |exec |connection |commands level]{default
    |list-name} [vrf vrf-name] [start-stop|stop-only|none][broadcast][method][method2]
          auth-proxy   提供有关所有认证代理用户事件的信息
          system       为所有非用户相关的系统级事件执行记帐
          network      为所有网络相关的服务请求运行记帐
          exec         为EXEC shell会话运行记帐。
          connection    提供所有有关源子NAS的外出连接的信息
          commands      为所有处于特定特权级别的命令运行记帐,有效的特权级别取值0-15
          default       使用本参数之后列出的记帐方式
          list-name     用来命令记帐方式列表的字符串
          vrf vrf-name 规定一个VRF配置
          start-stop    在一个过程的开端,发送一个开始记帐通知,在过程结束时,发送一个停止记帐通知

          stop-only     在被请求用户工程结束时发送一个停止记帐通知
          none          禁止此链路或接口上的记帐服务
          broadcast           启用发送记帐记录到多个3A服务器,同时向每个组中第一台服务器发送记帐记
    录  www.2cto.com  
          method 规定一下关键子中的至少一个
             group radius   用所有RADIUS服务器列表作为记帐
             group tacacs+ 用所有列出的TACACS+服务器来记帐
             group group-name 用RADIUS或TACACS+服务器的一个子集作为记帐
        在路由器上启用下列命令以启用几张
       aaa accounting system wait-start local   用记帐方法审计系统事件
       aaa accounting network stop-only local   当网络服务中断,发送停止记录通知
       aaa accounting exec start-stop local     当EXEC过程开始时,发送一个开始记录通知,结束时,发
    送停止记录
       aaa accounting commands 15 wait-start local   在任何级别15的命令开始之前,发送一个开始记录通
    知,并等待确认,当命令中止时,发送一个停止记录通知。
           
    6 校验配置
       debug aaa authentication 显示有关认证功能的调试信息
       debug aaa authorization 显示有关授权功能的调试信息
       debug aaa accounting     显示有关记帐功能的调试信息
     

    展开全文
  • 网络——网络安全设备部署

    千次阅读 2019-08-30 16:49:34
    网络安全设计通常包含下列因素: ...6.不同网络设备上的访问控制和访问控制机制,比如ACL和CAR 什么是CAR: Committed Access Rate 承诺访问速率 主要有两个作用 1.对一个端口或者子端口的进出流量...

    网络安全设计通常包含下列因素:

    1.设备安全特性,如管理员密码和不同网络组建中的SSH

    2.防火墙

    3.远程访问VPN服务器

    4.入侵检测

    5.安全AAA服务器和网络上相关的AAA服务

    6.不同网络设备上的访问控制和访问控制机制,比如ACL和CAR

     

    什么是CAR:

    Committed Access Rate 承诺访问速率

    主要有两个作用

    1.对一个端口或者子端口的进出流量速率安某个标准上限进行限制;

    2.对流量进行分类,划分出不同的Qos优先级;

     

    CAR只能对IP包起作用,对非IP流量不能进行限制。另外CAR只能支持CEF(Cisco Express Forward)交换的路由器或者交换机上使用。

    不能在这些接口上使用CAR

    Fast EtherChannel interface

    Tunnel Interface

    PRI interface

     

    CAR工作原理数据包分类识别和流量控制的结合;

    流程如下:

    1.先从数据流中识别出希望进行流量控制的流量类型,

    可以通过以下方式进行识别:

    全部IP流量

    基于IP前缀,通过rate-limit access list 来定义

    Qos分组

    MAC地址 通过rate-limit access list 来定义

    IP access list 访问控制列表

     

    2.识别出流量以后,进行流量均衡,(traffic measurement) 采用一种名为token bucket的机制

    token即识别到的感兴趣流量,这种流量数据进入一个bucket(桶)中,该bucket深度有用户定义,进入bucket以后,以用户希望控制的速率离开该bucket,执行下一步操作(conform actin);

     

    3.可能会发生两种情况:

    实际流量小于或等于用户希望速率,bucket可看作是空的

    实际流量大于用户希望速率,这样token进入bucket的速率比离开bucket的速率快,过了一段时间后,tken将填满bucket,继续到来的tken将溢出bucket,则CAR采取相应动作(一般是丢弃或将IP前缀改变以改变该token的优先级)

     

     

    展开全文
  • Python可以在不同的网络层上与网络设备进行交互。 首先,Python可以通过套接字编程和socket模块操纵底层网络,从而为Python所在的操作系统和网络设备之间搭建一个低层次的网络接口。此外,Python模块还可以通过...

    现在,我们已经知道如何在不同的操作系统中使用和安装Python以及如何使用EVE-NG搭建网络拓扑。在本章中,我们将学习如何使用目前常用的网络自动化库自动完成各种网络任务。Python可以在不同的网络层上与网络设备进行交互。

    首先,Python可以通过套接字编程和socket模块操纵底层网络,从而为Python所在的操作系统和网络设备之间搭建一个低层次的网络接口。此外,Python模块还可以通过Telnet、SSH和API与网络设备进行更高级别的交互。本章将深入探讨如何在Python中使用Telnet与SSH模块在远程设备上建立连接和执行命令。

    本章主要介绍以下内容:

    • 使用Python通过Telnet连接设备;
    • Python和SSH;
    • 使用netaddr处理IP地址和网络;
    • 网络自动化实战示例。

    1 技术要求

    应检查是否正确安装了下列工具并保证它们能够正常使用:

    • Python 2.7.1x;
    • PyCharm社区版或专业版;
    • EVE-NG,网络仿真器的安装和配置请参阅第3章。

    本章中出现的所有脚本请参见GitHub网站。

    1.1 Python和SSH

    SSH和Telnet的不同之处在于客户端与服务器之间交换数据的通道不一样。SSH使用的是安全链路,在客户端和设备之间创建了一个使用不同的安全机制进行加密的隧道,通信内容很难被解密。因此在需要保证网络安全的时候,网络工程师会首先选择使用SSH协议。

    Paramiko库遵循SSH2协议,支持身份验证,密钥处理(DSA、RSA、ECDSA和ED25519),以及其他SSH功能(如proxy命令和SFTP)。在Python中当需要使用SSH连接到网络设备时通常使用这个库。

    1.2 Paramiko模块

    Paramiko是Python中应用最广的SSH模块。模块本身使用Python语言编写和开发,只有像crypto这样的核心函数才会用到C语言。从其GitHub官方链接上能够看到代码的贡献者和模块历史等诸多信息。

    1.安装模块

    打开Windows cmd或Linux shell,运行下面的命令,从PyPI下载最新的Paramiko模块。如下图所示,同时,该命令会自动下载其他依赖包(如cyrptography、ipaddress和six),并将它们安装到计算机上。

    pip install paramiko

    在命令行中输入Python,然后导入Paramiko模块,验证是否安装成功。如下图所示,正确安装之后,能够成功导入模块。也就是说,命令行上不会出现任何错误提示。

    2.用SSH连接网络设备

    如前所述,要使用Paramiko模块,首先需要在Python脚本中导入它,然后通过继承SSHClient()来创建SSH客户端。然后,设置Paramiko的参数,使其能够自动添加任意未知的主机密钥并信任与服务器之间的连接。接下来,将远程主机的信息(IP地址、用户名和密码等)传递给connect函数。

    #!/usr/bin/python
    __author__ = "Bassim Aly"
    __EMAIL__ = "basim.alyy@gmail.com"
    
    import paramiko
    import time
    Channel = paramiko.SSHClient()
    Channel.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    Channel.connect(hostname="10.10.88.112", username='admin',
    password='access123', look_for_keys=False,allow_agent=False)
    
    shell = Channel.invoke_shell()

     

    AutoAddPolicy()是一种策略,可以作为函数set_missing_host_key_policy()的输入参数。在虚拟实验室环境中推荐使用这种策略,但在生产环境中应当使用更加严格的策略,如WarningPolicy()或RejectPolicy()。

    最后,invoke_shell()将启动一个连接到SSH服务器的交互式shell会话。在调用该函数时可以传入一些其他参数(如终端类型、宽度、高度等)。

    Paramiko的连接参数如下。

    • Look_For_Keys:默认为True,强制Paramiko使用密钥进行身份验证。也就是说,用户需要使用私钥和公钥对网络设备进行身份验证。在这里使用密码验证,因此将该参数设置为False。
    • allow_agent:表示是否允许连接到SSH代理,默认为True。在用密钥验证时可能需要使用这个选项。由于这里使用的是用户名/密码,因此禁用它。

    最后一步,把各种命令(如show ip int b和show arp)发送到设备终端,并将返回结果输出到Python窗口中。

    shell.send("enable\n")
    shell.send("access123\n")
    shell.send("terminal length 0\n")
    shell.send("show ip int b\n")
    shell.send("show arp \n")
    time.sleep(2)
    print shell.recv(5000)
    Channel.close()

    脚本运行结果如下图所示。

     

    如果需要在远程设备上执行耗时很长的命令,就要强制Python等待一段时间,直到设备生成输出并将结果返回给Python,因此最好使用time.sleep()。否则,Python可能得不到正确的输出结果。

    1.3 netmiko模块

    netmiko是Paramiko的增强版本,专门面向网络设备。虽然Paramiko能够处理与设备的SSH连接并判断设备类型是服务器、打印机还是网络设备,但netmiko在设计时针对网络设备做了优化,能够更有效地处理SSH连接。netmiko还支持各种不同的设备厂商和平台。

    netmiko也是对Paramiko的封装,它使用许多其他增强功能扩展了Paramiko,比如使用启用的密码直接访问所支持的设备,从文件读取配置并将推送到设备,在登录期间禁用分页显示,以及默认在每条命令后面加上回车符"\n"。

    1.支持的设备商

    netmiko支持许多供应商的设备,并定期在支持列表中添加新的供应商。netmiko支持的供应商列表分为定期测试类、有限测试类和实验类。在该模块的GitHub页面上可以找到这个列表。

    定期测试类中支持的供应商如下图所示。

    有限测试类中支持的供应商如下图所示。

    实验类中支持的供应商如下图所示。

    2.安装和验证

    安装netmiko非常简单。打开Windows命令行窗口或Linux shell,执行下面的命令就可以从PyPI获取最新版本的netmiko包(见下图)。

    pip install netmiko

    然后,在Python shell中导入netmiko,验证模块是否正确地安装到Python site-packages中。

    $python
    >>>import netmiko

    3.使用netmiko建立SSH连接

    现在该开始使用netmiko了,让我们来看看它强大的SSH功能。首先连接到网络设备并在上面执行命令。默认情况下,netmiko在建立会话(session)的过程中会在后台处理许多操作(如添加未知的SSH密钥主机,设置终端类型、宽度和高度),在需要的时候还可以进入特权(enable)模式,然后通过运行供应商提供的命令来禁用分页。

    首先,以字典格式定义设备并提供下列5个必需的关键信息。

    R1 = (
        'device type ': 'cisco ios',
        'ip': '10.10.88.110',
        'username': 'admin',
        'password': 'access123',
        'secret': 'access123',
    }

    第一个参数是device_type,为了执行正确的命令,需要使用这个参数来定义平台供应商。然后,需要SSH的IP地址。如果已经使用DNS解析了IP地址,该参数可能是主机名;否则,该参数是IP地址。接下来,提供username、password以及以secret参数传递的特权模式的密码。注意,可以使用getpass()模块隐藏密码,并且只在脚本执行期间提示它们。

     

    虽然变量中的密钥序列不重要,但是为了使netmiko能够正确解析字典并开始和设备建立连接,密钥的名称应该和之前示例中提供的密钥完全一样。

    接下来,从netmiko模块导入ConnectHandler函数,并提供定义的字典来开始建立连接。因为所有的设备是通过特权模式的密码配置的,所以需要为创建的连接提供.enable(),以在特权模式下访问。使用.send_command()在路由器终端上执行命令,.send_command()将会执行命令并通过变量的值显示设备的输出。

    from netmiko import ConnectHandler
    connection = ConnectHandler(**R1)
    connection.enable()
    output = connection.send_command("show ip int b")
    print output

    脚本输出结果如下。

    注意,这里看到的输出结果去掉了命令行中的命令回显和设备提示符。默认情况下,netmiko会替换设备的返回结果,使输出更加整洁,替换过程通过正则表达式完成,这部分会在下一章中介绍。

    如果不想使用这种方式,而是希望看到命令提示符,并在返回结果的后面执行命令,可以在.send_command()函数中加上以下参数。

    output = connection.send_command("show ip int
    b",strip_command=False,strip_prompt=False)

    strip_command=False和strip_prompt=False告诉netmiko保留而不是替换命令行回显和提示符。默认情况下它为True,可以根据需要进行设置。

    4.使用netmiko配置设备

    netmiko可以通过SSH配置远程设备,通过.config方法进入设备的配置模式,然后按照list格式中的信息(配置列表)配置设备。配置列表可以直接写在Python脚本中,也可以从文件中读取,然后用readlines()方法转换为列表。

    from netmiko import ConnectHandler
    
    SW2 = {
         'device_type': 'cisco_ios',
         'ip': '10.10.88.112',
         'username': 'admin',
         'password': 'access123',
         'secret': 'access123',
    }
    
    core_sw_config = ["int range gig0/1 - 2","switchport trunk encapsulation
    dot1q",
                      "switchport mode trunk","switchport trunk allowed vlan
    1,2"]
    
    print "########## Connecting to Device {0} ############".format(SW2['ip'])
    net_connect = ConnectHandler(**SW2)
    net_connect.enable()
    print "***** Sending Configuration to Device *****"
    net_connect.send_config_set(core_sw_config)

    上面的脚本以另外一种形式连接到SW2并进入特权模式。但这次使用的是另一个netmiko方法——send_config_set(),该方法需要使用列表形式的配置文件,同时进入设备的配置模式并根据列表对设备进行配置。这里测试了一个简单的配置,即修改gig0/1和gig0/2,并将这两个端口配成trunk模式。在设备上执行show run命令时,如果命令执行成功,会出现类似下面的输出。

    5.netmiko中的异常处理

    在设计Python脚本时,我们可能会假设设备已启动并运行,并且用户已提供了正确的登录信息,但实际情况并非总是如此。有时Python和远程设备之间的网络连接可能存在问题,或者用户输入了错误的登录信息。如果发生这种情况,Python通常会抛出异常并退出,但这种解决方案显然不够完美。

    netmiko中的异常处理模块netmiko.ssh_exception提供的一些异常处理类可以处理上面所说的那些情况。第一个类AuthenticationException能够捕获远程设备中的身份验证错误。第二个类NetMikoTimeoutException能够捕获netmiko和设备之间的超时或任何连接问题。下面的例子中使用try-except子句包含了ConnectHandler()方法,用来捕获超时和身份验证异常。

    from netmiko import ConnectHandler
    from netmiko.ssh_exception import AuthenticationException,
    NetMikoTimeoutException
    device = {
        'device_type': 'cisco_ios',
        'ip': '10.10.88.112',
        'username': 'admin',
        'password': 'access123',
        'secret': 'access123',
    }
    
    print "########## Connecting to Device {0}
    ############".format(device['ip'])
    try:
        net_connect = ConnectHandler(**device)
        net_connect.enable()
    
        print "***** show ip configuration of Device *****"
        output = net_connect.send_command("show ip int b")
        print output
    
        net_connect.disconnect()
    
    except NetMikoTimeoutException:
        print "=========== SOMETHING WRONG HAPPEN WITH {0}
    ============".format(device['ip'])
    
    except AuthenticationException:
        print "========= Authentication Failed with {0}
    ============".format(device['ip'])
    
    except Exception as unknown_error:
        print "============ SOMETHING UNKNOWN HAPPEN WITH {0} ============"

    6.设备自动发现

    netmiko提供了一种可以“猜测”设备类型和发现设备的机制。通过组合使用SNMP发现OIDS和在远程控制台上执行多个show命令这两种方式,根据输出字符串检测路由器的操作系统和类型。然后,netmiko将相应的驱动程序加载到ConnectHandler()类中。

    #!/usr/local/bin/python
    __author__ = "Bassim Aly"
    __EMAIL__ = "basim.alyy@gmail.com"
    
    from netmiko import SSHDetect, Netmiko
    device = {
    'device_type': 'autodetect',
    'host': '10.10.88.110',
    'username': 'admin',
    'password': "access123",
    }
    
    detect_device = SSHDetect(**device)
    device_type = detect_device.autodetect()
    print(device_type)
    print(detect_device.potential_matches)
    
    device['device_type'] = device_type
    connection = Netmiko(**device)

    在上面的脚本中,应注意以下几点。

    首先,设备字典中的device_type等于autodetect,也就是告诉netmiko在检测到设备类型之前不要加载驱动程序。

    然后,使用netmiko的SSHDetect()类发现设备。它使用SSH连接到设备,并执行一些命令以找出操作系统的类型,结果以字典形式返回。

    接着,使用autodetect()函数将匹配度最高的结果赋给device_type变量。

    接下来,输出potential_matches,查看字典内的全部返回结果。

    最后,可以更新设备字典并为其分配新的device_type。

    2 在Python中使用Telnet协议

    Telnet是TCP/IP协议栈中最早可用的协议之一,主要用来在服务器和客户端之间建立连接、交换数据。服务器端监听TCP端口23,等待客户端的连接请求。

    在下面的例子中,我们将创建一个Python脚本作为Telnet客户端,拓扑中的其他路由器和交换机则作为Telnet服务器。Python原生的telnetlib库已经支持Telnet,所以不需要另外安装。

    客户端对象可以通过telnetlib模块中的Telnet()类实例化创建。通过这个对象,我们能够使用telnetlib中的两个重要函数——read_until()(用于读取输出结果)和write()(用于向远程设备写入内容)。这两个函数用来和Telnet连接交互,从Telnet连接读取或向Telnet连接写入数据。

    还有一点非常关键,使用read_until()读取Telnet连接的内容之后缓冲区会被清空,无法再次读取。因此,如果在后面的处理中还会用到之前读取的重要数据,需要在脚本里将其另存为变量。

     

    Telnet数据以明文形式发送,因此通过“中间人攻击”可以捕获并查看到Telnet数据,如用户信息和密码。即便如此,一些服务提供商和企业仍然在使用它,只是他们会集成VPN和radius/tacacs协议,以提供轻量级和安全的访问方式。

    让我们一步步分析这个脚本。

    (1)在Python脚本中导入telnetlib模块,在变量中定义用户名和密码。代码如下。

    import telnetlib
    username = "admin"
    password = "access123"
    enable_password = "access123"

    (2)定义一个变量,用来和远程主机建立连接。注意,只需要提供远程主机的IP地址,不用在连接建立过程中提供用户名或密码。

    cnx = telnetlib.Telnet(host="10.10.88.110") #here we're telnet to
    Gateway

    (3)通过读取Telnet连接返回的输出并搜索“Username:”关键字来提供Telnet连接的用户名。然后写入管理员用户名。如果需要,用同样的方法输入Telnet密码。

    cnx.read_until("Username:")
    cnx.write(username + "\n")
    cnx.read_until("Password:")
    cnx.write(password + "\n")
    cnx.read_until(">")
    cnx.write("en" + "\n")
    cnx.read_until("Password:")
    cnx.write(enable_password + "\n")

      

    Telnet连接建好之后,在脚本中加上控制台提示符非常重要;否则,连接将陷入死循环。接着Python脚本就会超时并出现错误。

    (4)向Telnet连接写入show ip interface brief命令并开始读取返回内容,直到出现路由器提示符(#)为止。通过以下命令可以得到路由器的接口配置。

    cnx.read_until("#")
    cnx.write("show ip int b" + "\n")
    output = cnx.read_until("#")
    print output

    完整的脚本如下所示。

    脚本运行结果如下所示。

    注意,在输出中包含了执行的命令show ip int b,并且在stdout中输出和返回了路由器提示符"R1#"。可以使用内置的字符串函数(如replace())从输出中清除它们。

    cleaned_output = output.replace("show ip int b","").replace("R1#","")
    print cleaned_output

    你可能已经注意到脚本中使用了密码并将密码以明文形式写下来,这样做显然是不安全的。同时,在Python脚本中使用硬编码也不是好习惯。在下一节中,我们将学习如何隐藏密码并设计一种机制,从而在脚本运行时要求用户输入密码。

    此外,如果要执行那些输出结果可能跨越多个页面的命令(如show running config),则需要在连接到设备之后和发送命令之前,先通过发送termindl length 0来禁用分页。

    使用telnetlib推送配置

    在上一节中,我们通过执行show ip int brief简单介绍了telnetlib的操作过程。现在我们要用telnetlib将VLAN配置推送到实验室网络拓扑中的4台交换机。使用Python的range()函数创建一个VLAN列表,遍历列表将VLAN ID推送到当前交换机。注意,我们将交换机的IP地址放到了另一个列表中,使用外部for循环来遍历这个列表。同时使用内置模块getpass隐藏控制台中的密码,在脚本运行时提示用户输入密码。

    #!/usr/bin/python
    import telnetlib
    import getpass
    import time
    
    switch_ips = ["10.10.88.111", "10.10.88.112", "10.10.88.113",
    "10.10.88.114"]
    username = raw_input("Please Enter your username:")
    password = getpass.getpass("Please Enter your Password:")
    enable_password = getpass.getpass("Please Enter your Enable Password:")
    
    for sw_ip in switch_ips:
        print "\n#################### Working on Device " + sw_ip + "
    ####################"
        connection = telnetlib.Telnet(host=sw_ip.strip())
        connection.read_until("Username:")
        connection.write(username + "\n")
        connection.read_until("Password:")
        connection.write(password + "\n")
        connection.read_until(">")
        connection.write("enable" + "\n")
        connection.read_until("Password:")
        connection.write(enable_password + "\n")
        connection.read_until("#")
        connection.write("config terminal" + "\n") # now i'm in config mode
        vlans = range(300,400)
        for vlan_id in vlans:
            print "\n********* Adding VLAN " + str(vlan_id) + "**********"
            connection.read_until("#")
            connection.write("vlan " + str(vlan_id) + "\n")
            time.sleep(1)
            connection.write("exit" + "\n")
            connection.read_until("#")
        connection.close()

    最外层的for循环用来遍历设备列表,然后在每次循环(每个设备)中生成范围为300~400的VLAN ID并将它们推送到当前设备。

    脚本运行结果如下。

    当然,也可以通过交换机控制台检查运行结果(仅显示部分结果)。

    3 使用netaddr处理IP地址和网络

    管理和操作IP地址是网络工程师最重要的任务之一。Python开发人员提供了一个令人惊叹的库—— netaddr,它可以识别IP地址并对其进行处理。假设你开发了一个应用程序,其中需要获取129.183.1.55/21的网络地址和广播地址,通过模块内的内置方法network和broadcast可以轻松地获取到相应的地址。

    net.network
    129.183.0.
    net.broadcast
    129.183.0.0

    netaddr支持很多功能。

    在第3层的地址中,netaddr支持下列功能。

    • 识别IPv4和IPv6地址、子网、掩码和前缀。
    • 对IP网络进行迭代、切片、排序、汇总和分类。
    • 处理各种格式(CIDR、任意子网长度、nmap)。
    • 对IP地址和子网进行集合操作(联合、交叉等)。
    • 解析各种不同的格式和符号。
    • 查找IANA IP块信息。
    • 生成DNS反向查找结果。
    • 检索超网和生成子网。

    在第2层的地址中,netaddr支持下列功能。

    • 展示和操作Mac地址与EUI-64标识符。
    • 查找IEEE组织信息(OUI、IAB)。
    • 生成链路本地的IPv6地址。

    3.1 安装netaddr

    使用pip安装netaddr模块,命令如下。

    pip install netaddr

    安装完成之后打开PyCharm或Python控制台并导入模块,验证模块是否安装成功。如果没有出现错误信息,说明模块安装成功。

    python
    >>>import netaddr

    3.2 使用netaddr的方法

    netaddr模块提供了两种重要的方法来定义IP地址并对其进行处理。第一种方法是IPAddress(),它用来定义具有默认子网掩码的单个有类IP地址。第二种方法是IPNetwork(),它使用CIDR定义无类IP地址。

    两种方法都将IP地址作为字符串来处理,根据字符串返回IP地址或IP网络对象。返回的对象还可以继续执行许多方法,比如判断IP地址是单播地址、多播地址、环回地址、私有地址还是公有地址,以及地址有效还是无效地址。这些操作的结果是True或False。在Python的if条件中可以直接使用这些方法。

    另外,该模块支持使用==、<和>等比较运算符比较两个 IP 地址,从而生成子网。它还可以检索一个给定IP地址或者子网术语的超网列表。最终,netaddr模块可以生成有效主机的一个完整列表(不包括网络IP地址和网络广播地址)。

    #!/usr/bin/python
    __author__ = "Bassim Aly"
    __EMAIL__ = "basim.alyy@gmail.com"
    from netaddr import IPNetwork,IPAddress
    def check_ip_address(ipaddr):
        ip_attributes = []
        ipaddress = IPAddress(ipaddr)
    
        if ipaddress.is_private():
            ip_attributes.append("IP Address is Private")
        else:
            ip_attributes.append("IP Address is public")
        if ipaddress.is_unicast():
            ip_attributes.append("IP Address is unicast")
        elif ipaddress.is_multicast():
            ip_attributes.append("IP Address is multicast")
        if ipaddress.is_loopback():
            ip_attributes.append("IP Address is loopback")
    
        return "\n".join(ip_attributes)
    
    def operate_on_ip_network(ipnet):
    
        net_attributes = []
        net = IPNetwork(ipnet)
        net_attributes.append("Network IP Address is " + str(net.network) + "
        and Netowrk Mask is " + str(net.netmask))
    
        net_attributes.append("The Broadcast is " + str(net.broadcast) )
        net_attributes.append("IP Version is " + str(net.version) )
        net_attributes.append("Information known about this network is " +
        str(net.info) )
        net_attributes.append("The IPv6 representation is " + str(net.ipv6()))
        net_attributes.append("The Network size is " + str(net.size))
        net_attributes.append("Generating a list of ip addresses inside the
        subnet")
    
        for ip in net:
            net_attributes.append("\t" + str(ip))
        return "\n".join(net_attributes)
    
    ipaddr = raw_input("Please Enter the IP Address: ")
    print check_ip_address(ipaddr)
    
    ipnet = raw_input("Please Enter the IP Network: ")
    print operate_on_ip_network(ipnet)

    在上面的脚本中,首先使用raw_input()函数请求用户输入IP地址和IP网络,然后将输入的值作为参数传递给两个用户方法check_ip_address()和operate_on_ip_network()并调用它们。第一个函数check_ip_address()会检查输入的IP地址,同时尝试生成有关IP地址属性的报告(例如,IP地址是单播、多播、私有还是环回地址),并将输出返回给用户。

    第二个函数operate_on_ip_network()用来完成和网络相关的操作,即生成网络ID、掩码、广播、版本、网络上的已知信息、IPv6地址的显示方式,最后生成该子网内的所有IP地址。

    注意,net.info只能对公共IP地址生成可用信息,对私有IP地址不起作用。

    同样,在使用之前需要先从netaddr模块导入IP Network和IP Address。

    脚本运行结果如下所示。

    4 简单的用例

    随着网络变得越来越大,其中包含更多来自各种不同供应商的设备,这就需要创建模块化的Python脚本来自动执行各种任务。接下来的几节将分析3个用例,这些用例可以从网络中收集不同信息,缩短解决问题所需的时间,或者至少将网络配置恢复到其上次已知的良好状态。使用自动化工作流来处理网络故障、修复网络环境,网络工程师能够更关心工作完成情况,提高业务水平。

    4.1 备份设备配置

    备份设备配置对于任何一名网络工程师来说都是最重要的任务之一。在这个用例中,我们将使用netmiko库设计一个示例Python脚本。该脚本用来备份设备配置,它适用于不同的供应商和平台。

    为方便日后访问或引用,我们将根据设备IP地址格式化输出文件名,例如,SW1备份操作的输出文件保存在dev_10.10.88.111_.cfg中。

    创建Python脚本

    从定义交换机开始,我们希望将其配置备份为文本文件(设备文件),用逗号分隔访问设备的用户名、密码等详细信息。这样就可以在Python脚本中使用split()函数来获取这些数据,方便在ConnectHandler函数中使用这些数据。此外,还可以从Microsoft Excel工作表或任何数据库中轻松导出该文件以及把该文件导入其中。

    文件结构如下。

    <device_ipaddress>,<username>,<password>,<enable_password>,<vendor>

    创建Python脚本,使用with open子句在脚本中导入该文件。在导入的文件对象上使用readlines()方法将文件中的每一行组成列表,然后用for循环逐行遍历文件,用split()函数获取每一行中用逗号隔开的设备信息,并将它们赋予相应的变量。

    from netmiko import ConnectHandler
    from datetime import datetime
    
    with
    open("/media/bassim/DATA/GoogleDrive/Packt/EnterpriseAutomationProject/Chap
    ter5_Using_Python_to_manage_network_devices/UC1_devices.txt") as
    devices_file:
        devices = devices_file.readlines()
    for line in devices:
        line = line.strip("\n")
        ipaddr = line.split(",")[0]
        username = line.split(",")[1]
        password = line.split(",")[2]
        enable_password = line.split(",")[3]
    
        vendor = line.split(",")[4]
    
        if vendor.lower() == "cisco":
            device_type = "cisco_ios"
            backup_command = "show running-config"
    
        elif vendor.lower() == "juniper":
            device_type = "juniper"
            backup_command = "show configuration | display set"

    由于我们的目标是创建模块化的、支持多种设备供应商的脚本,因此在if子句中需要检查设备供应商,并为该设备分配正确的device_type和backup_command。

    接下来,建立与设备的SSH连接,使用netmiko模块中的.send_command()方法执行备份命令。

    print str(datetime.now()) + " Connecting to device {}" .format(ipaddr)
    
    net_connect = ConnectHandler(device_type=device_type,
                                 ip=ipaddr,
                                 username=username,
                                 password=password,
                                 secret=enable_password)
    net_connect.enable()
    running_config = net_connect.send_command(backup_command)
    
    print str(datetime.now()) + " Saving config from device {}" .format(ipaddr)
    
    f = open( "dev_" + ipaddr + "_.cfg", "w")
    f.write(running_config)
    f.close()
    print "=============================================="

    在最后的几行中,以写入方式打开一个文件(文件不存在时将自动创建),文件名中包含了前面从设备文件中读取的ipaddr变量。

    脚本运行结果如下。

    需要注意的是,备份的配置文件存储在项目的主目录中,文件名称包含每个设备的IP地址(见下图)。

     

    使用Linux服务器上的cron任务,或Windows服务器上的计划任务,可让服务器在指定时间运行上面的Python脚本。例如,每天凌晨运行一次,将配置信息存储在latest目录中,以方便运维团队使用。

    4.2 创建访问终端

    在Python或其他编程活动中,你就是自己的设备供应商。为了满足自己的需求,你可以创建任何喜欢的代码组合和程序。在第二个例子中我们创建自己的终端(terminal),通过telnetlib访问路由器。只需要在终端写几个单词,就会在网络设备中执行很多命令并返回输出结果。输出结果将会显示在标准输出或保存在文件中。

    #!/usr/bin/python
    __author__ = "Bassim Aly"
    __EMAIL__ = "basim.alyy@gmail.com"
    
    import telnetlib
    
    connection = telnetlib.Telnet(host="10.10.88.110")
    connection.read_until("Username:")
    connection.write("admin" + "\n")
    connection.read_until("Password:")
    connection.write("access123" + "\n")
    connection.read_until(">")
    connection.write("en" + "\n")
    connection.read_until("Password:")
    connection.write("access123" + "\n")
    connection.read_until("#")
    connection.write("terminal length 0" + "\n")
    connection.read_until("#")
    while True:
        command = raw_input("#:")
        if "health" in command.lower():
            commands = ["show ip int b",
                        "show ip route",
                        "show clock",
                        "show banner motd"
                        ]
    
        elif "discover" in command.lower():
            commands = ["show arp",
                        "show version | i uptime",
                        "show inventory",
                        ]
    else:
        commands = [command]
    for cmd in commands:
        connection.write(cmd + "\n")
        output = connection.read_until("#")
        print output
        print "==================="

    首先,建立到路由器的Telnet连接并输入相应的用户信息,一直到打开特权(enable)模式。然后,创建一个始终为true的无限while循环,使用内置的raw_input()函数捕捉用户输入的命令。脚本捕获到用户输入之后,在网络设备上执行这些命令。

    如果用户输入关键字health或discover,终端将自动执行一系列命令以反映期望的操作。这些关键字在排除网络故障时非常有用,可以根据常用的操作自由扩展它们。想象一下,在需要解决两个路由器之间的开放式最短路径优先(Open Shortest Path First,OSPF)邻居问题时,只要打开自己的Python终端脚本(这个脚本中已经写好了几个排除故障常用的命令),并将这些命令打包到诸如tshoot_ospf之类的if条件之后。一旦脚本看到这个关键字,它就会执行这些命令,输出OSPF邻居状态、MTU的接口、OSPF的广播网络等,简化定位问题的过程。

    通过在提示符中输入health尝试脚本中的第一条命令。脚本输出结果如下。

    可以看到,脚本将返回在设备上执行多条命令后的结果。

    接着试一下第二个命令discover。脚本输出结果如下。

    这次脚本返回discover命令的输出。在后面的章节中,我们将会解析返回的输出结果并从中提取有用的信息。

    4.3 从Excel工作表中读取数据

    网络和IT工程师始终使用Excel工作表来存储基础设施的相关信息,如IP地址、设备供应商和登录凭证。Python支持从Excel工作表中读取数据并对其进行处理,以便我们在脚本中使用数据。

    在这个用例中,我们将使用Excel Read(xlrd)模块读取UC3_devices.xlsx文件。该文件保存了基础设施的主机名、IP地址、用户名、普通密码、特权模式下的密码和供应商名称。然后将读到的数据用作netmiko模块的输入。

    Excel工作表中的内容如下图所示。

    首先,用pip安装xlrd模块,因为需要用它来读取Microsoft Excel工作表。

    pip install xlrd

    xlrd模块能够读取Excel工作表并将行和列转换为矩阵。比如,row[0][0]代表第一行第一列的单元格,右边紧接着它的单元格是row[0][1](见下图),以此类推。

    xlrd在读取工作表时,每次读取一行,同时特殊计数器nrows(行数)自动加1。同样,每次读取一列,ncols(列数)自动加1,这样我们就能够通过这两个参数知道矩阵的大小。

    然后,在xlrd的open_workbook()函数中输入文件路径,并用sheet_by_index()或sheet_by_name()函数访问工作表。在本例中,数据存储在第一个工作表(index = 0)中,工作表文件存储在以章为名的文件夹下。接着,遍历工作表的每一行,或者使用row()函数来访问指定行。返回的输出结果是一个列表,使用索引可以访问列表中的元素。

    Python脚本如下。

    __author__ = "Bassim Aly"
    __EMAIL__ = "basim.alyy@gmail.com"
    
    from netmiko import ConnectHandler
    from netmiko.ssh_exception import AuthenticationException,
    NetMikoTimeoutException
    import xlrd
    from pprint import pprint
    
    workbook =
    xlrd.open_workbook(r"/media/bassim/DATA/GoogleDrive/Packt/EnterpriseAutomat
    ionProject/Chapter4_Using_Python_to_manage_network_devices/UC3_devices.xlsx
    ")
    
    sheet = workbook.sheet_by_index(0)
    
    for index in range(1, sheet.nrows):
        hostname = sheet.row(index)[0].value
        ipaddr = sheet.row(index)[1].value
        username = sheet.row(index)[2].value
        password = sheet.row(index)[3].value
        enable_password = sheet.row(index)[4].value
        vendor = sheet.row(index)[5].value
    
        device = {
            'device_type': vendor,
            'ip': ipaddr,
            'username': username,
            'password': password,
            'secret': enable_password,
    
        }
        # pprint(device)
    
        print "########## Connecting to Device {0}
    ############".format(device['ip'])
        try:
            net_connect = ConnectHandler(**device)
            net_connect.enable()
    
            print "***** show ip configuration of Device *****"
            output = net_connect.send_command("show ip int b")
            print output
    
            net_connect.disconnect()
    
        except NetMikoTimeoutException:
            print "=======SOMETHING WRONG HAPPEN WITH
    {0}=======".format(device['ip'])
    
        except AuthenticationException:
            print "=======Authentication Failed with
    {0}=======".format(device['ip'])
    except Exception as unknown_error:
        print "=======SOMETHING UNKNOWN HAPPEN WITH {0}======="

    4.4 其他用例

    使用netmiko可以实现很多网络自动化用例。例如,在升级期间从远程设备上传/下载文件,利用Jinja2模板加载配置,访问终端服务器,访问终端设备等。要了解更多用例,请参见GitHub官网(见下图)。

    5 小结

    在本章中,我们开始使用Python进入网络自动化世界。本章讨论了Python中的一些工具,通过Telnet和SSH建立到远程节点的连接,并在远程设备上执行命令。此外,本章还讲述了如何在netaddr模块的帮助下处理IP地址和网络子网。最后通过两个实际用例巩固了这些知识。

    本文摘自:《Python自动化运维实战》

    Pythonèªå¨åè¿ç»´å®æ

    • 运维工程师教程书籍,自动化运维实践
    • 通过Python模块、库与工具自动配置和管理大量服务器的讲解,提高运维的效率

    《Python自动化运维实战》介绍了如何通过Python来自动完成服务器的配置与管理,自动完成系统的管理任务(如用户管理、数据库管理和进程管理),以及完成这些工作所需的模块、库和工具。此外,本书还讲述了如何使用Python脚本自动执行测试,如何通过Python在云基础设施和虚拟机上自动执行任务,如何使用基于Python的安全工具自动完成与安全相关的任务。 
    本书适合运维人员和开发人员阅读,也可作为相关专业人士的参考书。

    展开全文
  • 网卡驱动为每个新的接口在一个全局的网络设备列表里插入一个数据结构.每个接口由一个结构 net_device 项来描述, 它在 里定义.每一个接口必须动态分配内存。
  • 考试形式:上机考试考试内容:上机考试内容要求:按照...1、(40分)某部门网络拓扑如图1所示。Router0: E0:172.16.11.1/24 S0:172.16.20.1/24Router1: S0:172.16.20.2/24 S1:172.16.40.1/24 Router2: E0:172....
  • 下图是模拟某学校网络拓扑结构在该学校网络接入层采用S2126,接入层交换机划分了办公网VLAN2和学生网VLAN4,VLAN2和VLAN4通过汇聚层交换机S3550与路由器A相连另3550上有一个VLAN3存放一台网管机。路由器A与B通过路由...
  • java面试题32:Java网络程序设计中,下列正确的描述是() A:Java网络编程API建立在Socket基础之上 B:Java网络接口只支持tcP以及其上层协议 C:Java网络接口只支持UDP以及其上层协议 D:Java网络接口支持IP...
  • 第一层 (物理层) 集线器 中继器 第二层 (数据链路层) 二层交换机 网桥  第三层 (网络层) 路由器 三层交换机
  •  设备下列两种情况下进行注册: 1)加载NIC驱动时 2)插入热插拔设备时  这里NIC与热插拔设备有些不同。a.对于非热插拔NIC来说,NIC的注册是伴随着其驱动的发生的,而NIC可以内建到内核,也可以作为模块载入,...
  • wpcap.dll为了获得与释放已连接的网络适配器设备列表,提供了下列函数: 文件/wpcap/libpcap/pcap/pcap.h中 struct pcap_if; struct pcap_addr; int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf...
  • nbd网络设备使用教程

    千次阅读 2013-01-16 18:00:01
    NBD(Network Block Device)让你可以将一个远程主机的磁盘空间,当作一个块设备来使用.就像一块硬盘一样. 使用它,你可以很方便的将另一台服务器的硬盘空间,增加到本地服务器上. NBD与NFS有所不同.NFS只是提供一个...
  • 相关题目与解析涉密计算机、涉密存储设备不得接入互联网及其他公共信息网络。()将涉密计算机、涉密存储设备接入互联网及其他公共...()下列行为中属于违反涉密计算机信息系统管理的有()。A.将涉密计算机、涉密存储...
  • 设备注册于设备除名  设备注册与设备除名一般有 register_netdev和unregister_netdev完成。这两个是包裹函数,负责上锁,真正起作用的是其调用的register_netdevice和unregister_netdevice。参见:net/core/dev.c...
  • 计算机三级网络技术考过指南

    万次阅读 多人点赞 2018-03-10 19:18:36
    计算机三级网络技术考过指南 原文链接:计算机三级网络技术考过指南 题库下载链接(50积分是CSDN上调的,不是我上传时设置的。更新版本请大家自行搜索):计算机三级网络技术无纸化考试模拟软件(2018.3) 用...
  • 计算机网络期末复习题

    万次阅读 2020-12-31 08:48:25
    2、下列传输介质中,哪种传输介质的抗干扰性最好? A、双绞线 B、光缆 C、同轴电缆 D、无线介质 3、采用全双工通信方式,数据传输的方向性结构为______。 A、可以在两个方向上同时传输 B、只能在一个方向上传...
  • CentOS7网络配置

    万次阅读 多人点赞 2015-11-11 09:17:39
    所以之前在6.x版本上的网络配置操作在7.x上行不通了。 下面介绍一下在CentOS7.x上进行网络配置的方法。 环境准备:新安装的CentOS7.x,最小化安装,没有进行网络配置。 1、查看当前网卡信息[root@localhost ~]# ...
  • 计算机网络谢希仁第七版 课后答案

    万次阅读 多人点赞 2019-09-03 23:13:25
    谢希仁计算机网络第七版课后答案 第一章 概述 1-01 计算机网络向用户可以提供那些服务?答: 连通性和共享 1-02 简述分组交换的要点。答:(1)报文分组,加首部(2)经路由器储存转发(3)在目的地合并 1-03 试从多...
  • 所有的和网络有关的应用程序都不可用了,不能拨号,无线可以在察看services 后,发现 remote access connection manager 没有启动,相应的remote access autoconnection manager 也没有启动 尝试手动启动,均不能...
  • 问:与 Computer Browser 服务相依的 Server 服务因下列错误而无法启动: 无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动。 是什么意思? 答: Computer Browser服务 是 计算机浏览器服务. 该服务在带网络...
  • 88.Python语言的主要应用领域是(人工智能,网络爬虫,数据分析与处理) 89.判断三条线段a,b,c能否构成三角形的条件表达式,正确的是__(a>0)and(b>0)and(c>0)and(a+b>c)and(a+c>b)and(b+c>a)__。 90.语句a,b=b,a的...
  • 计算机网络复习题(全套)

    万次阅读 多人点赞 2017-11-25 19:40:43
    3、随着电信和信息技术的发展,国际上出现了所谓“三网融合”的趋势,下列属于三网之一的是(ABC) A.传统电信网 B.计算机网 C.有线电视网 D.卫星通信网 4、通信系统必须具备的三个基本要素是( C ) A、终端、电缆...
  • 计算机网络之第3章 数据链路层

    千次阅读 2020-10-07 20:39:48
    下列属于数据链路层的互连设备是 网桥和交换机 封装成帧 某个数据链路层协议使用下列字符编码:字符A的编码为 01000111 字符B的编码为 11100011 字符ESC的编码为 11100000 字符FLAG的编码为 01111110 使用字符F
  • 大学计算机网络复习题

    万次阅读 多人点赞 2013-01-13 10:09:00
    、在当前的网络系统中,由于网络覆盖面积的大小、技术条件和工作环境不同,通常分为广域网、  局域网 、和城域网三种。 3、常用的通信介质主要有有线介质和   无线 介质两大类。  4、网络服务器有文件...
  • 计算机网络选择填空题

    千次阅读 2020-05-13 10:57:45
    3、随着电信和信息技术的发展,国际上出现了所谓“三网融合”的趋势,下列属于三网之一的是(ABC) A.传统电信网 B.计算机网 C.有线电视网 D.卫星通信网 4、通信系统必须具备的三个基本要素是( C ) A、终端、电缆、...
  • 华为网络技术大赛模拟题答案详解

    万次阅读 多人点赞 2016-05-09 17:20:00
    华为网络技术大赛模拟题答案详解 一、判断题 (1)VLSM的作用是:在有类的IP地址基础上,从主机位部分划分出相应的位数做为网络位。但是在路由器上部署时,需要路由协议的支持。 【解释】对,VLSM=Variable Length ...
  • 网络基础——牛客网刷题第四波

    千次阅读 2019-06-06 21:11:38
    1.ATM网络采用固定长度的信元传送数据,信元长度为(B) A. 1024B B. 53B C. 128B D. 64B 解析:ATM 网络采用固定长度的信元传送数据: 信元长度:53 B,其中头长度为5 B,数据长度为48B; 2.来一波干货: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,987
精华内容 29,594
关键字:

下列属于网络设备