使用Python paramiko模块利用多线程实现ssh并发执行操作


Posted in Python onDecember 05, 2019

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 相关文章推荐
Python实现的数据结构与算法之队列详解
Apr 22 Python
Python简单实现Base64编码和解码的方法
Apr 29 Python
python删除服务器文件代码示例
Feb 09 Python
python快速建立超简单的web服务器的实现方法
Feb 17 Python
python爬虫爬取淘宝商品信息
Feb 23 Python
Python进阶之自定义对象实现切片功能
Jan 07 Python
Python字典遍历操作实例小结
Mar 05 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
Jun 27 Python
pytorch实现mnist数据集的图像可视化及保存
Jan 14 Python
windows、linux下打包Python3程序详细方法
Mar 17 Python
Python 删除List元素的三种方法remove、pop、del
Nov 16 Python
PyMongo 查询数据的实现
Jun 28 Python
Python使用指定字符长度切分数据示例
Dec 05 #Python
python从zip中删除指定后缀文件(推荐)
Dec 05 #Python
python3 求约数的实例
Dec 05 #Python
python生成特定分布数的实例
Dec 05 #Python
python 实现生成均匀分布的点
Dec 05 #Python
pd.DataFrame统计各列数值多少的实例
Dec 05 #Python
python使用beautifulsoup4爬取酷狗音乐代码实例
Dec 04 #Python
You might like
PHP 数组入门教程小结
2009/05/20 PHP
php中使用接口实现工厂设计模式的代码
2012/06/17 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
php实现的微信红包算法分析(非官方)
2015/09/25 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
laravel 中如何使用ajax和vue总结
2017/08/16 PHP
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
Javascript学习笔记之函数篇(五) : 构造函数
2014/11/23 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
Bootstrap carousel轮转图的使用实例详解
2016/05/17 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
解决Layui数据表格中checkbox位置不居中的方法
2018/08/15 Javascript
AngularJS 事件发布机制
2018/08/28 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
layui实现三级导航菜单
2019/07/26 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
H5 js点击按钮复制文本到粘贴板
2020/11/19 Javascript
Python中方法链的使用方法
2016/02/23 Python
Python多层装饰器用法实例分析
2018/02/09 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
python中的时区问题
2021/01/14 Python
英国袜子店:Sock Shop
2017/01/11 全球购物
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
Talbots官网:美国成熟女装品牌
2019/11/15 全球购物
性能测试工程师的面试题
2015/02/20 面试题
副总经理任命书
2014/06/05 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
员工加薪申请报告
2015/05/15 职场文书
初中语文教学随笔
2015/08/15 职场文书
毕业生的自我鉴定表范文
2019/05/16 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书
如何利用React实现图片识别App
2022/02/18 Javascript