使用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实现爬虫下载漫画示例
Feb 16 Python
理解Python中的With语句
Feb 02 Python
pyqt5自定义信号实例解析
Jan 31 Python
浅谈python 读excel数值为浮点型的问题
Dec 25 Python
PyCharm的设置方法和第一个Python程序的建立
Jan 16 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 Python
详解python websocket获取实时数据的几种常见链接方式
Jul 01 Python
使用Pytorch来拟合函数方式
Jan 14 Python
Django bulk_create()、update()与数据库事务的效率对比分析
May 15 Python
python 使用csv模块读写csv格式文件的示例
Dec 02 Python
基于python的matplotlib制作双Y轴图
Apr 20 Python
Python绘画好看的星空图
Mar 17 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
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
php产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
Zend studio文件注释模板设置方法
2013/09/29 PHP
JScript中的"this"关键字使用方式补充材料
2007/03/08 Javascript
Javascript 多浏览器兼容总结(实战经验)
2013/10/30 Javascript
js 中将多个逗号替换为一个逗号的代码
2014/06/07 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
javascript性能优化之事件委托实例详解
2015/12/12 Javascript
Treegrid的动态加载实例代码
2016/04/29 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
js+canvas实现画板功能
2020/09/13 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
Python的Django框架中模板碎片缓存简介
2015/07/24 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
Python定义一个跨越多行的字符串的多种方法小结
2018/07/19 Python
python使用opencv驱动摄像头的方法
2018/08/03 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
如何真正的了解python装饰器
2020/08/14 Python
python时间time模块处理大全
2020/10/25 Python
python 实现性别识别
2020/11/21 Python
Python 微信公众号文章爬取的示例代码
2020/11/30 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
The North Face北面英国官网:美国著名户外品牌
2017/12/13 全球购物
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
DOUGLAS荷兰:购买香水和化妆品
2020/10/24 全球购物
中软国际Java程序员机试题
2012/08/19 面试题
高中生的自我鉴定范文
2014/01/24 职场文书
学生宿舍管理制度
2014/01/30 职场文书
关于是否需要写商业计划书
2014/02/07 职场文书
企业节能减排实施方案
2014/03/19 职场文书
阳光体育活动总结
2014/04/30 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL
口袋妖怪冰系十大最强精灵,几何雪花排第七,第六类似北极熊
2022/03/18 日漫