zoukankan      html  css  js  c++  java
  • 使用Python库paramiko登录远程设备

    前言

    手动下载paramiko库的安装包。在PyPi库中查找即可,但是不到是我的电脑问题还是网络问题,2.0.0以上版本我都安装不了,因此我自己是安装的paramiko 1.17.0版本,此版本经过测试是可以用的

    下载安装paramiko

    windows手动安装,挺简单的,只需找到解压后安装包的目录,然后使用下面两条命令即可

    python setup.py build
    python setup.py install
    
    

    pip安装,直接执行下面的命令,如果是虚拟环境,请先切换到虚拟环境后在安装

    pip install paramiko==1.17.0
    
    

    使用paramiko登录设备

    使用paramiko库登录设备极其简单而且能力很强,通常情况下,使用secureCRT能够登录到设备,就能够使用paramiko库成功登录。示例代码如下:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time : 2020/2/23 11:05 下午
    # @Author : paul
    # @Site : 
    # @File : test.py
    
    
    import paramiko
    
    if __name__ == '__main__':
        hostname = '127.0.0.1'  # 主机名
        username = 'root'  # 用户名
        password = '123456'  # 密码
    
        # ssh login
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(hostname=hostname, username=username, password=password, timeout=10)
        # 关闭连接
        ssh.close()
        
    

    此段代码通过我自己的服务器CentOS6.5进行测试,可以使用。

    登录成功之后,当然是希望可以输入命令来进行交互,以实现获取系统数据。这里总结了三种交互方式。

    paramiko和设备交互方式

    一次输入一个命令

    如小标题所示,此中情况为只需要输入一个命令,例如只是要获取系统的某个参数。此时可以采用类似SSHClient下的exec_command函数进行输入,命令以字符串的形式表示。示例代码如下:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time : 2020/2/23 11:17 下午
    # @Author : paul
    # @Site : 
    # @File : test2.py
    
    
    import paramiko
    
    if __name__ == '__main__':
        hostname = '127.0.0.1'  # 主机名
        username = 'root'  # 用户名
        password = '123456'  # 密码
    
        # ssh login
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(hostname=hostname, username=username, password=password, timeout=10)
    
        # 执行命令
        stdin , stdout , stderr = ssh.exec_command(cmd)
        # the stdin, stdout, and stderr of the executing command, as a 3-tuple
        # stdin : 输入内容
        # stdout : 输出内容
        # stderr : 错误信息
        print(stdout.read())
        ssh.close()
        
    

    当然,这里需要搞清楚,exec_command()方法也不是说只能执行一条命令,其实也能执行多条命令,但是这多条命令需要用&&符号拼接成一条命令,但是此种方式只能适用于命令提示符不变的情况下:

    cmd1 = 'cd /'
    cmd2 = 'ls -l'
    cmd = cmd1 + "&&" + cmd2
    
    # 执行命令
    stdin , stdout , stderr = ssh.exec_command(cmd)
    
    

    一次输入多个命令

    此种方式可以实现多个命令的方式,通过模拟输入/输出文件流与系统交互。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time : 2020/2/23 11:31 下午
    # @Author : paul
    # @Site : 
    # @File : test3.py
    
    
    import paramiko
    
    if __name__ == '__main__':
        hostname = '127.0.0.1'  # 主机名
        username = 'root'  # 用户名
        password = '123456'  # 密码
    
        # ssh login
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(hostname=hostname, username=username, password=password, timeout=10)
    
        channel = ssh.invoke_shell()
        stdin = channel.makefile('wb') # 输入流
        stdout = channel.makefile('rb') # 输出流
        
        stdin.write('cd /home
    ls
    exit
    ') # 输入需要加入回车符号
        print(stdout.read())
        
        ssh.close()
        
    

    输入命令有stdin.write(command)来完成,需要注意的是,这种交互方式进行交互的话,需要一次性将命令写完,包括退出命令exit(不同系统有不同的退出命令),每个命令用 (回车符)表示结束。

    多次输入/输出交互

    1.类channel中的send(command)函数为多次交互提供了便利

    2.命令以字符串的形式输入,需要使用" "作为结尾,但是不需要系统登出命令作为所有命令的结尾。

    3.可以实现命令交互,但是需要结合recv_read()方法进行,即当允许读的时候再进行读取。

    如下提供了一个多命令交互的示例。await_command(channel)为等待是否能够读取的函数,receive_data(channel)为可以读取之后,读取输入命令之后的数据。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time : 2020/2/23 11:49 下午
    # @Author : paul
    # @Site : 
    # @File : test4.py
    
    import paramiko
    import time
    
    
    def await_command(channel):
        while True:
            if channel.recv_ready():
                return True
            else:
                time.sleep(0.5)
            return False
    
    
    def receive_data(channel):
        all_data = str()
        while True:
            tmp_data = channel.recv(1024)
            all_data += tmp_data
            # 这里的结束循环的条件可以根据实际情况来设定
            if "#" in all_data:
                break
        return all_data
    
    
    if __name__ == '__main__':
        hostname = '127.0.0.1'  # 主机名
        username = 'root'  # 用户名
        password = '123456'  # 密码
    
        try:
            # ssh login
            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ssh.connect(hostname=hostname, username=username, password=password, timeout=10)
            # 创建一个面板用来显示交互
            channel = ssh.invoke_shell()
    
            # 发送命令,接收数据
            channel.send('cd /home
    ')
            await_command(channel)
            print(receive_data(channel))
    
            channel.send('ls -l
    ')
            await_command(channel)
            print(receive_data(channel))
    
            ssh.close()
        except Exception as e:
            raise Exception('connect error')
    
    

    如果需要进行一行一行的读取时,也可以将makefile应用过来,如下:

    def receive_data(channel):
        reader = channel.makefile()
        while True:
            line = reader.readline()
            print(line)
            if '#' in line:
                break
        return line
    
    

    总结

    parmiko库是一个功能很强大的库,为我们提供了很多的交互方式,但是实际上我们需要根据自己的应用选择合适的交互方式,合适的才是最好的。

  • 相关阅读:
    王建军_百度百科
    腾讯研究院关于研究院
    创业公司3Gear Systems利用Kinect打造未来人机交互体验 | 36氪
    KVM切换器_互动百科
    保荐人考试
    Engadget 中文版征人启事 《 they're hiring
    吸血僵尸惊情四百年
    小霸王手机
    ARM、高通、德州仪器这三家芯片企业该怎么区分和评价?
    《美丽心灵》兼谈纳什均衡理论
  • 原文地址:https://www.cnblogs.com/oden/p/12355259.html
Copyright © 2011-2022 走看看