前言

手动下载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\rls\rexit\r') # 输入需要加入回车符号
print(stdout.read()) ssh.close()

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

多次输入/输出交互

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

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

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\r')
await_command(channel)
print(receive_data(channel)) channel.send('ls -l\r')
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库是一个功能很强大的库,为我们提供了很多的交互方式,但是实际上我们需要根据自己的应用选择合适的交互方式,合适的才是最好的。

使用Python库paramiko登录远程设备的更多相关文章

  1. python库requests登录zhihu

    废了很大劲,开始搞错了登录post信息的网址,后来没找到xsrf信息,看了很多文章才搞定. 大概过程如下: 打开登录页面,同时打开fldder,输入信息去监控过程. 查看post了哪些信息,哪些是自己 ...

  2. 利用python 下paramiko模块无密码登录

    利用python 下paramiko模块无密码登录   上次我个大家介绍了利用paramiko这个模块,可以模拟ssh登陆远程服务器,并且可以返回执行的命令结果,这次给大家介绍下如何利用已经建立的密钥 ...

  3. 在Python中用Request库模拟登录(一):字幕库(无加密,无验证码)

    字幕库的登录表单如下所示,其中省去了无关紧要的内容: <form class="login-form" action="/User/login.html" ...

  4. Python的paramiko,实现ssh

    最简单的使用paramiko登录远程机器执行一些命令,学习实验楼的paramiko记录下来,第一次使用ConfigParser这个库,对于封装这些还是不太熟悉,只能慢慢来,嘿嘿嘿 这是python脚本 ...

  5. 使用python的Paramiko模块登陆SSH

    使用python的Paramiko模块登陆SSH paramiko是用Python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. python的paramiko模块 ...

  6. python自动化测试(4)-使用第三方python库技术实现

    python自动化测试(4)-使用第三方python库技术实现 1   概述 关于测试的方法论,都是建立在之前的文章里面提到的观点: 功能测试不建议做自动化 接口测试性价比最高 接口测试可以做自动化 ...

  7. Python 库大全

    作者:Lingfeng Ai链接:http://www.zhihu.com/question/24590883/answer/92420471来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非 ...

  8. python 多线程 paramiko实现批量命令输入输出

    远程批量执行命令 实现多线程执行 速度快 实现多并发登录 #-*- coding: utf-8 -*- #!/usr/bin/python import paramiko import threadi ...

  9. 哪些 Python 库让你相见恨晚?【转】

    原文链接:https://www.zhihu.com/question/24590883/answer/92420471 原文链接:Python 资源大全 ---------------- 这又是一个 ...

随机推荐

  1. C语言中typedef用法

    C语言中typedef用法 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等) ...

  2. jQuery初学者笔记 一

    jQuery初学者笔记 一 Mirror王宇阳 by jQuery语法 jQuery语法是通过选取HTML元素,并对选取的元素进行操作 基础语法: 所有jQuery语句用"$"符号 ...

  3. Comb使用2

    只需添加如下内容 AndroidManifest中添加如下 不要忘记修改application ID与Comb对应 最好不要采用将combSDK lib文件添加到工程中否则可能连接不了Comb 如果添 ...

  4. HDU6446 Tree and Permutation(树、推公式)

    题意: 给一棵N个点的树,对应于一个长为N的全排列,对于排列的每个相邻数字a和b,他们的贡献是对应树上顶点a和b的路径长,求所有排列的贡献和 思路: 对每一条边,边左边有x个点,右边有y个点,x+y= ...

  5. java架构之路-(微服务专题)初步认识微服务与nacos初步搭建

    历史演变: 以前我们都是一个war包,包含了很多很多的代码,反正我开始工作的时候做的就是这样的项目,一个金融系统,代码具体多少行记不清楚了,内部功能超多,但是实际能用到的不多,代码冗余超大,每次部署大 ...

  6. Go语言实现:【剑指offer】翻转单词顺序列

    该题目来源于牛客网<剑指offer>专题. 例如,"student. a am I",正确的句子应该是"I am a student." Go语言实 ...

  7. 原生servlet项目启动自动加载一个方法

    web.xml里的配置: 配置好要加载的类,其中1这一句是项目启动时自动加载该类的必要条件. <servlet> <servlet-name>SharePltfCLServle ...

  8. 大话IDL编程之函数功能调用(envi_doit、ENVIRaster、ENVITask)

    2020年2月1日.好长时间没更新博客,还真有点不习惯.受新型冠性病毒的影响,平时街上熙熙攘攘的人流了无踪影,2020的春节竟然来的如此冷清.为响应“呆在家里就是做贡献的号召”,在家一宅就是十多天.闲 ...

  9. PHP5.3的VC9、VC6、Thread Safe、Non Thread Safe的区别

    PHP一共给了四个版本,VC9 x86 Non Thread Safe.VC9 x86 Thread Safe.VC6 x86 Non Thread Safe.VC6 x86 Thread Safe, ...

  10. k8s系列--- dashboard认证及分级授权

    http://blog.itpub.net/28916011/viewspace-2215214/ 因版本不一样,略有改动 Dashboard官方地址: https://github.com/kube ...