侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   265

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 python3import sysimport getpassimport paramikoimport threadingimport 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.txtNmap scan report for 176.130.7.1Nmap scan report for 176.130.7.24Nmap scan report for 176.130.7.46Nmap scan report for 176.130.7.53Nmap 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使用指定字符长度切分数据示例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客