Python中,SSH的paramiko和网络设备

分享到:
更新时间:2015-11-18 14:06:05
 

Python中,SSH的paramiko和网络设备



你一直在学习Python,但作为网络工程师你能做什么呢?

在本文中,我将向你展示如何使用SSH的paramiko(Python的SSH文库)连接到路由器收集信息。

现在,我将使用Python来连接到一个人的接口。 由于各种原因,这种期望般方法是有问题的,例如,可以存在定时问题; 可以有意想不到的互动问题; 并

且可以有变化装置输出(OS版本之间,设备模型之间的,设备类型等之间)。

虽然这种期待般的方法是有问题的,在许多情况下,它是对现有设备自动化一个合理的选择(考虑当前可用的替代)。 这将跨越时间改变,因为新的

API(和其他管理/控制机制)变为可用,并在现场设备得到刷新和升级。 在我看来,用期待般机制的困难,也夸大了(不要误会我的意思也有很多的困

难,但API是不是所有称心如意其一)。

对于很多事情,一个Python SSH“期望般'的方法可以取得一个合理的方式工作,前提是你知道它的局限性; 你适当地测试; 你在使用时采取适当的预防措

施。

最后一个警告,这是一个关于网络自动化一般警告。 编程控制的一组网络设备是一个强大的能力,因为它是强大的利害关系显著增加。 您可能会有所改

变50的设备,而不是之一; 你可能会改变在多个地区的设备。 犯错的后果是大大增加。 因此,从小事做起。 开始用show命令,而不是配置更改。 当改

变养成良好的操作流程,知道自己在做什么; 在测试环境中适当地测试一下; 部署的变化,以一个单一的设备; 它扩大到一小部分设备; 考虑后果,如果事

情错了,你将如何改正; 确定这种变化是否是一件情理之中的事情编程。

因此,在该温暖和模糊的音符,让我们深入项。

所以你怎么能SSH到使用Python路由器?第一步就是要安装的paramiko SSH文库。 在我的环境(AWS使用AWS的Linux AMI“2013年9月2日”64位),在

安装过程中已经安装容易的paramiko。

如果您使用的是Mac OS,你想在本地安装的paramiko,那么你将需要一个C编译器。 因此,你需要下载Xcode中(或者你需要安装命令行工具)。 此

链接提供了一些 details http://osxdaily.com/2012/07/10/how-to-install-paramiko-and-pycrypto-in-mac-os-x-the-easy-way/ . 请注意,Xcode的下载是非常

大的。

如果您使用的是Windows,那么你将需要得到安装了Python第一。 一旦安装了Python,有链接,你可以在网上找到安装的paramiko。 您可能希望只运行

Linux虚拟机,但是。

对于其它Linux发行版/建立,如果通过的paramiko YUM或APT不可用,你也许可以使用画中画或easy_install的得到安装的paramiko。

既然已经安装的paramiko,让我们来测试它的工作原理:

 [根@ EC2用户]#蟒蛇
的Python 2.6.9(未知,2013年10月29日,19时58分十三秒)
 [GCC 4.6.3 20120306(红帽4.6.3-2)在将linux2
键入“help”,“版权”,“信贷”或“许可证”的更多信息。
 >>>进口的paramiko
 >>>

请注意,在我的AWS中,我进口的paramiko(的paramiko使用PyCrypto包)时收到两次警告的PyCrypto包。 第一次警告涉及到RandomPool; 我的研究

表明,过的paramiko可能解决此问题的工作。 第二个警告涉及到一个“定时攻击的脆弱性”和需要libgmp5或更高,我有相当大的麻烦找到此警告的其他有

用信息。 我现在已经注释掉在我的测试环境中这两种警告; 你必须决定如何处理环境中的这些警告。

好了的paramiko库导入,但你如何连接到路由器?

 [根@ EC2用户]#蟒蛇
的Python 2.6.9(未知,2013年10月29日,19时58分十三秒)
 [GCC 4.6.3 20120306(红帽4.6.3-2)在将linux2
键入“help”,“版权”,“信贷”或“许可证”的更多信息。
 >>>
 >>>进口的paramiko
 >>>
 >>> IP ='1.1.1.16'
 >>>用户名='testuser的'
 >>>密码=“密码”
 >>>
 >>> remote_conn_pre = paramiko.SSHClient()
 >>> remote_conn_pre
 <paramiko.SSHClient在0x15f47d0对象>
 >>>
 >>> remote_conn_pre.set_missing_host_key_policy(
 ... paramiko.AutoAddPolicy())
 >>>
 >>> remote_conn_pre.connect(IP,用户名=用户名,密码=密码,
 ... look_for_keys =假,allow_agent = FALSE)
 >>>

注意,本文中的例子,我一般修改IP地址,并始终修改密码。 我还添加了look_for_keys和allow_agent争论的事实(含测试)后。 无论look_for_keys和

allow_agent涉及到使用SSH密钥,并可能导致问题的密码验证(如果未禁用)。

那么到底发生了什么吗? 首先,我进口的paramiko库; 然后我初始化一些变量。 经过对变量进行初始化,然后我创建了一个的paramiko SSHClient对象

。 的paramiko介绍SSHClient类,“会话使用SSH服务器的高级别代表”。 创建SSHClient对象后,我再设置SSH主机密钥策略来自动添加SSH主机的基调

,这是一个安全问题,使您可能受到人在这方面的中间人攻击,所以要确保这是适合您的环境。 这是罚款我的测试环境。

在这一点上,我已经准备好使用SSH'连接'的方法传递的IP,用户名和密码变量来连接。 如果一切顺利,我应该有一个建立SSH会话。 让我们来看看“的

netstat”:

 [根@ EC2用户]#netstat的-an |  grep的22

                   
                       
  TCP

                           
  0

                           
  0

                              0.0.0.0:22
                              0.0.0.0:*
                              LISTEN
                   

                   
                       
  TCP

                           
  0

                           
  0

                           
  10.10.10.22:55566

                              1.1.1.16:22 
                              ESTABLISHED
                   

               

还有就是会话。 现在,让我们开始使用的paramiko invoke_shell()方法中,路由器的“交互shell”。

 >>> remote_conn = remote_conn_pre.invoke_shell()
 >>>

现在,如果一切工作的权利,我们应该可以与路由器进行通信。 让我们尝试从SSH通道进行读取,看看还有什么:

 >>>输出= remote_conn.recv(1000)
 >>>打印输出

 TWB-SF-881>
 >>>

在这里,我从通道(1000字节或任何目前可在缓冲区中的最大值)读取多达1000个字节。 然后,我打印输出。 还有就是我的路由器提示,“TWB-SF-

881>”。

现在,如果我们试图通过通道发送的命令是什么:

 >>>
 >>> remote_conn.send(“显示IP INT简短\ N”)
 18
 >>>输出= remote_conn.recv(5000)
 >>>打印输出
显示IP INT简要

   
         介面
              IP地址
             好不好?
             办法
             状态
             协定
   

   
       
 的FastEthernet0

           
 未分配

              YES
             未设置
             向上
             向上
   

   
          FastEthernet1
             未分配
              YES
             未设置
             向上
             向上
   

   
          FastEthernet2
             未分配
              YES
             未设置
             向下
             向下
   

   
          FastEthernet3
             未分配
              YES
             未设置
             向上
             向上
   

   
         的FastEthernet4
              1.1.1.16
              YES
              NVRAM
             向上
             向上
   

   
          NVI0
              1.1.1.16
              YES
             未设置
             向上
             向上
   

   
         通道1
              169.254.253.2
              YES
              NVRAM
             向上
             向下
   

   
         通道2
              169.254.253.6
              YES
              NVRAM
             向上
             向下
   

   
          VLAN1
             未分配
              YES
              NVRAM
             向下
             向下
   

   
          VLAN10
              10.2.8.1
              YES
              NVRAM
             向上
             向上
   

   
          VLAN20
              192.168.0.1
              YES
              NVRAM
             向下
             向下
   

   
          - 更多 - 
   

在这里,我把“显示IP INT短暂”命令下跌通道中。 请注意,我添加了一个换行符的命令的结束(即我模拟打在呈献给路由器线“ENTER”键)。 send命令

后显示的'18'就是我送下跌通道中的字节数。 然后我读缓冲区查看输出。 这一次,我增加了缓冲区大小为5000字节,以确保我收到的所有输出数据。 然

后,我打印输出。

因此,我们将能够连接到路由器,从该会话读出,发送一个命令到路由器。 现在,我们正在通过交互shell做这一切。 让我们在这个转换为基本的Python

程序,以便我们能够更好地重复使用我们的工作。

 [根@ CODE]#猫test-ssh.py
进口的paramiko
进口时间


高清disable_paging(remote_conn):
     '''禁用分页思科路由器上'''

     remote_conn.send(“码头长度0 \ N”)
     time.sleep(1)

     #清除屏幕上的缓冲
    输出= remote_conn.recv(1000)

    回报输出


如果__name__ =='__main__':


    需要CHANGED#变量
     IP ='1.1.1.16'
    用户名='testuser的'
    密码=“密码”

     #创建SSHClient对象实例
     remote_conn_pre = paramiko.SSHClient()

     #自动添加信任的主机(请确认好安全策略在您的环境)
     remote_conn_pre.set_missing_host_key_policy(
          paramiko.AutoAddPolicy())

     #启动SSH连接
     remote_conn_pre.connect(IP,用户名=用户名,密码=密码)
    打印“SSH连接建立到%s”%IP

     #使用invoke_shell建立一个“交互式会话”
     remote_conn = remote_conn_pre.invoke_shell()
    打印“交互式SSH会话建立”

     #地带初始路由器提示
    输出= remote_conn.recv(1000)

     #看看我们
    打印输出

     #关闭寻呼
     disable_paging(remote_conn)

     #现在,让我们尝试发送路由器的命令
     remote_conn.send(“\ N”)
     remote_conn.send(“显示IP INT简短\ N”)

     #等待命令完成
     time.sleep(2)
   
    输出= remote_conn.recv(5000)
    打印输出

 [[email protected]]#

现在,这是类似于我们所做的互动环节,除了我加了一些打印语句,表示当程序运行时发生了什么问题。 此外,我创建了一个功能disable_paging(即 -

更多的提示)。 我还增加了一个小的延迟到程序(发送“显示IP INT简短的\ N'命令后,读缓冲区之前)。 这是如果你发送的命令,然后立即读取可能的

缓冲路由器就不会回应还没有或只有部分回应必需的,因为。 您可以测试删除你的睡眠自己,当我测试它,我得到了一个异常,因为数据缓冲区是空的

。 一,我做其他的小调整是发送“显示IP INT短暂”命令之前发送一个换行符。 这仅仅是输出格式(所以路由器的提示显示了在我们预期的方式输出)。

好吧,让我们来看看,当我运行该脚本会发生什么:

 [根@ CODE]#蟒蛇test-ssh.py
 SSH连接建立1.1.1.16
交互式SSH会话建立

 TWB-SF-881>

 TWB-SF-881>显示IP INT简要

   
         介面
              IP地址
             好不好?
             办法
             状态
             协定
    的FastEthernet0

    未分配

              YES
             未设置
             向上
             向上
   

          FastEthernet1
             未分配
              YES
             未设置
             向上
             向上
   

          FastEthernet2
             未分配
              YES
             未设置
             向下
             向下
   

          FastEthernet3
             未分配
              YES
             未设置
             向上
             向上
   

   
         的FastEthernet4
              1.1.1.16
              YES
              NVRAM
             向上
             向上
   

   
          NVI0
              1.1.1.16
              YES
             未设置
             向上
             向上
   

   
         通道1
              169.254.253.2
              YES
              NVRAM
             向上
             向下
   

   
         通道2
              169.254.253.6
              YES
              NVRAM
             向上
             向下
   

   
          VLAN1
             未分配
              YES
              NVRAM
             向下
             向下
   

   
          VLAN10
              10.2.8.1
              YES
              NVRAM
             向上
             向上
   

   
          VLAN20
              192.168.0.1
              YES
              NVRAM
             向下
             向下
   

          VLAN100
              10.2.4.1
              YES
              NVRAM
             向上
             向上
   

  TWB-SF-881>
 [[email protected]]#

请注意,在“更多 - ”页面消失了。

这证明它不是太难使用SSH“期待类”方法到P​​ython集成到路由器。 此外,就可以开始看到这样类似的东西,收集信息并进行修改,一组网络设备的潜力

。如果您有任何意见或建议请登录官网联系我们。北大青鸟官网


        点击拨打北大青鸟电话  点击拨打北大青鸟电话  点击北大青鸟咨询师交谈

相关信息
没有相关内容
©Copyright2015 - 2016 , All Rights Reserved
版权所有2015-2016 北大青鸟APTECH( 北京佳音旗舰 ) 授权培训中心
地址:北京西城区北礼士路100号( 阜成门地铁旁)