python paramiko并发_使用Python paramiko模块利用多线程实现ssh并发执行操作
1.paramiko概述
ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。
有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。
由于paramiko属于第三方库,所以需要使用如下命令先行安装
2.安装paramiko
pip install paramiko
3.常用方法
connect():实现远程服务器的连接与认证,对于该方法只有hostname是必传参数。
常用参数
hostname 连接的目标主机
port=SSH_PORT 指定端口
username=None 验证的用户名
password=None 验证的用户密码
pkey=None 私钥方式用于身份验证
key_filename=None 一个文件名或文件列表,指定私钥文件
timeout=None 可选的tcp连接超时时间
allow_agent=True, 是否允许连接到ssh代理,默认为True 允许
look_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许
compress=False, 是否打开压缩
set_missing_host_key_policy():设置远程服务器没有在know_hosts文件中记录时的应对策略。目前支持三种策略:
设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种:
AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认
WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接
RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项
exec_command():在远程服务器执行Linux命令的方法。
如 exec_command("ls /") exec_command("df -h")
4.使用方法
import paramiko
# 实例化SSHClient
client = paramiko.SSHClient()
# 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接SSH服务端,以用户名和密码进行认证
client.connect(hostname='192.168.1.1', port=22, username='root', password='123456')
# 打开一个Channel并执行命令
stdin, stdout, stderr = client.exec_command('df -h ') # stdout 为正确输出,stderr为错误输出,同时是有1个变量有值
# 打印执行结果
print(stdout.read().decode('utf-8'))
# 关闭SSHClient
client.close()
5.利用多线程实现ssh并发访问
要求:
编写一个remote_comm.py脚本,实现以下功能:
在文件中取出所有远程主机IP地址
在shell命令行中接受远程服务器IP地址文件、远程服务器密码以及在远程主机上执行的命令
通过多线程实现在所有的远程服务器上并发执行命令
步骤一:编写脚本
#!/usr/bin/env python3
import sys
import getpass
import paramiko
import threading
import os
#创建函数实现远程连接主机、服务器密码以及在远程主机上执行的命令的功能
def remote_comm(host, pwd, command):
#创建用于连接ssh服务器的实例
ssh = paramiko.SSHClient()
#设置自动添加主机密钥
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接ssh服务器,添加连接的主机、用户名、密码填好,捕获异常,有异常则跳出函数
try:
ssh.connect(hostname=host, username='root', password=pwd)
except:
return
#在ssh服务器上执行指定命令,返回3项类文件对象,分别是,输入、输出、错误
stdin, stdout, stderr = ssh.exec_command(command)
#读取输出
out = stdout.read()
#读取错误
error = stderr.read()
#如果有输出
if out:
#打印主机输出内容
print('[%s] OUT:\n%s' % (host, out.decode('utf8')))
#如果有错误
if error:
#打印主机错误信息
print('[%s] ERROR:\n%s' % (host, error.decode('utf8')))
#程序结束
ssh.close()
if __name__ == '__main__':
#设定sys.argv长度,确保remote_comm函数中参数数量
if len(sys.argv) != 3:
print('Usage: %s ipaddr_file "command"' % sys.argv[0])
exit(1)
#判断命令行上输入如果不是文件,确保输入的是文件
if not os.path.isfile(sys.argv[1]):
print('No such file:', sys.argv[1])
exit(2)
#fname为存储远程主机ip的文件,用sys.argv方法,可以在执行脚本时再输入文件名,更为灵活
fname = sys.argv[1]
#command为在远程主机上执行的命令,用sys.argv方法,可以在执行脚本时再输入相应命令,command为remote_comm函数第三个参数
command = sys.argv[2]
#通过getpass输入远程服务器密码,pwd为remote_comm函数第二个参数
# pwd = getpass.getpass()
pwd='Taren1.bgsn'
#打开存有远程主机ip的文件
with open(fname) as fobj:
#将遍历文件将ip以列表形式存入ips,line.strip()可以去掉每行ip后\n
ips = [line.strip() for line in fobj]
#循环遍历列表,获取ip地址,ip为remote_comm函数第一个参数
for ip in ips:
#将读取到的ip地址作为remote_comm函数实际参数传递给函数,ips中有几个ip地址循环几次
#创建多线程
t = threading.Thread(target=remote_comm, args=(ip, pwd, command))
#启用多线程
t.start()
步骤二:编写ssh名单
创建一个文件,输入某个网段所有可以ping通的ip,可以先用nmap出活跃主机扫描,或者自己编写一个python脚本
[root@room9pc01 ~]#nmap -n -sP 176.130.7.0/24 | grep 176 | awk '{print $5}' > /mnt/server_addr.txt
[root@room9pc01 ~]#cat /mnt/server_addr.txt
Nmap scan report for 176.130.7.1
Nmap scan report for 176.130.7.24
Nmap scan report for 176.130.7.46
Nmap scan report for 176.130.7.53
Nmap scan report for 176.130.7.57
.....................
步骤三:执行脚本
执行脚本,此脚本有两个参数,一个是文件参数,一个是执行命令
[root@room9pc01 mnt]# python3 ssh.py server_addr.txt 'who'
[176.130.7.57] OUT:
student :0 2019-12-02 09:04 (:0)
student pts/0 2019-12-02 15:03 (:0)
[176.130.7.169] OUT:
student :0 2019-12-02 08:17 (:0)
student pts/0 2019-12-02 08:23 (:0)
student pts/4 2019-12-02 08:24 (:0)
[176.130.7.162] OUT:
student :0 2019-12-02 08:17 (:0)
student pts/0 2019-12-02 15:03 (:0)
[176.130.7.178] OUT:
student :0 2019-12-02 08:06 (:0)
总结
以上所述是小编给大家介绍的使用Python paramiko模块利用多线程实现ssh并发执行操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
python paramiko并发_使用Python paramiko模块利用多线程实现ssh并发执行操作相关推荐
- 多线程导出excel高并发_大牛带你深入java多线程与高并发:JMH与Disruptor,确定能学会?...
前言 今天我们讲两个内容,第一个是JMH,第二个是Disruptor.这两个内容是给大家做更进一步的这种多线程和高并发的一些专业上的处理.生产环境之中我们很可能不自己定义消息队列,而是使用 Disru ...
- python 时间序列预测_使用Python进行动手时间序列预测
python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...
- python 概率分布模型_使用python的概率模型进行公司估值
python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...
- python paramiko使用_使用python的paramiko模块实现ssh与scp功能
#1. 介绍 这篇文章简单地介绍了python的paramiko模块的用法,paramiko实现了SSH协议,能够方便地与远程计算机交互.简单的说,就是你在terminal下执行的如下语句,现在可以通 ...
- python paramiko并发_python学习笔记9--paramiko模块、多线程、锁机制
一.paramiko模块 paramiko模块是一个遵循ssh2协议的python扩展模块,该模块可以允许使用python通过ssh协议去远程管理主机.在使用该模块前,需要手动安装,具体安装过程请百度 ...
- python访问数据库如何解决高并发_使用 Python 和 Oracle 数据库实现高并发性
随着趋势发展的核心转向更多而不是更快发展,最大限度地提高并发性的重要性日益凸显.并发性使得编程模式发生了新的转变,可以编写异步代码,从而将多个任务分散到一组线程或进程中并行工作.如果您不是编程新手并且 ...
- python socket多线程并发_【Python之旅】第五篇(三):Python Socket多线程并发
前面的几个例子都是单线程的,下面再来说说多线程的. 1.多线程模块 主要是socketserver模块,如下图示: 2.多线程原理 如下图示说明: 3.SockteServer例子说明 服务器端: 客 ...
- python 多线程并发_寻找python大神!!!python如何多线程并发?
不是大神.尝试回答一下. 首先解释下什么叫做线程,什么叫做进程,在解释这两个概念前,我们还需要明白什么叫做GIL全局解释器锁.GIL 全局解释器锁: GIL(全局解释器锁,GIL 只有cpython有 ...
- python 参数封装_扩展Python模块系列(三)----参数解析与结果封装
在上一节中,通过一个简单的例子介绍了C语言扩展Python内建模块的整体流程,从本节开始讲开始深入讨论一些细节问题,在细节讨论中从始至终都会涉及[引用计数]的问题.首先讨论C语言封装的Python函数 ...
最新文章
- ls 中一些你不知道的事
- [轉]JavaScript获取HTML DOM父,子,临近节点
- 【Java】生成UUID
- 互联网人的《三十而已》:裸辞,催婚,职业瓶颈,逃离北上广深......
- Java正则判断中文字符串句型_NLP中文句子类型判别和分类实现
- a programmer should know...
- 怎么调试内存溢出的c++代码_【C/C++】内存对齐 到底怎么回事?
- Python模块之MyQR——制作个性化动态二维码(超详细)
- MySQL数据技术嘉年华,带你深入MySQL的世界
- 启动和停止一个服务,修改服务的启动类型 Start and Stop Service for windows
- 51Nod-1091 线段的重叠【排序】
- 适合android平板的浏览器,推荐5款安卓平板Pad版应用浏览器
- 计算机电路基础第三版清华大学出版社答案,清华大学出版社-图书详情-《计算机电路基础(第2版)》...
- CCPC-Wannafly Winter Camp Day1 (Div2, onsite) A 机器人 分类讨论
- CF 1728 D. Letter Picking 区间dp 1800
- html5跳棋游戏,跳棋小游戏大全
- 来,给产品狗起个正儿八经的名字!
- 第四局 借问酒家何处有?牧童遥指杏花村 下
- 佳能c3020维修模式 白电平调整_佳能5d3 如何调色温
- OA系统如何实现实时项目成本核算
热门文章
- 后端 消息 转发_【后端开发】Servlet怎么转发
- python实验报告二_分组级运算和转换
- vooc是什么快充协议_5G时代除了网速,快充同样重要!
- mysql 自动归档,如何将数据库从非归档模式转为自动归档模式:
- java监听窗口饮品,Java 完成部分水吧点饮品系统的:点饮品,饮品管理片段的实现...
- 第一行代码第一章——你的第一行Android代码
- python(matplotlib3)——ticks(坐标刻度)能见度
- 2018南京网络赛L题 Magical Girl Haze(分层图+优先队列优化的dijkstra)
- 用python画哆啦a梦的代码解释_python画哆啦A梦和大雄
- office word中利用宏编程批量调节图片的亮度和对比度