使用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 (2)
Oct 31 Python
python zip文件 压缩
Dec 24 Python
Python升级提示Tkinter模块找不到的解决方法
Aug 22 Python
Python import自定义模块方法
Feb 12 Python
python简单判断序列是否为空的方法
Jun 30 Python
使用Python编写简单的端口扫描器的实例分享
Dec 18 Python
python爬虫爬取快手视频多线程下载功能
Feb 28 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
Dec 28 Python
python实现QQ空间自动点赞功能
Apr 09 Python
python 实现检验33品种数据是否是正态分布
Dec 09 Python
详解Python中的编码问题(encoding与decode、str与bytes)
Sep 30 Python
python时间time模块处理大全
Oct 25 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
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
2017/05/02 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
Javascript中Eval函数的使用说明
2008/10/11 Javascript
Javascript select控件操作大全(新增、修改、删除、选中、清空、判断存在等)
2008/12/19 Javascript
JS定时器实例
2013/04/17 Javascript
jQuery文本框(input textare)事件绑定方法教程
2013/04/24 Javascript
JavaScript三元运算符的多种使用技巧
2015/04/16 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
从零开始在NPM上发布一个Vue组件的方法步骤
2018/12/20 Javascript
小程序实现搜索框功能
2020/03/26 Javascript
JS中准确判断变量类型的方法
2020/06/01 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
2020/06/10 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
在Django中限制已登录用户的访问的方法
2015/07/23 Python
python3实现读取chrome浏览器cookie
2016/06/19 Python
Python win32com 操作Exce的l简单方法(必看)
2017/05/25 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
python判断设备是否联网的方法
2018/06/29 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
Python模块_PyLibTiff读取tif文件的实例
2020/01/13 Python
西班牙汉普顿小姐:购买帆布鞋和太阳镜
2016/10/23 全球购物
英语专业个人求职自荐信
2013/09/21 职场文书
学生个人自我鉴定
2014/03/26 职场文书
大跃进口号
2014/06/16 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
平凡的世界读书笔记
2015/06/25 职场文书
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL
SQL SERVER中的流程控制语句
2022/05/25 SQL Server
mysql查看表结构的三种方法总结
2022/07/07 MySQL