Python[8] :paramiko模块多进程批量管理主机

简介:

今天和大家聊聊paramiko模块


一、paramiko简介

  • paramiko是用Python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。

  • paramiko主要是通过ssh协议对远程主机进行管理:包括执行远程主机CLI上传下载文件等。


二、快速安装paramiko模块

pip的详细安装请参考我的另外一篇文章:http://467754239.blog.51cto.com/4878013/1613612

1
2
# yum install python-devel
# pip install paramiko


三、paramiko命令参数详解


  • 利用密码登陆方式批量执行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
导入模块
import  paramiko
 
实例化一个SSHClient对象
=  paramiko.SSHClient()
 
自动添加策略   #首次登陆用交互式确定(允许连接不在know_hosts文件中的主机)
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 
要连接的主机地址信息
s.connect(hostname = 'ip地址' , port = 端口号, username = '用户名' , password = '密码' )
 
要执行的命令
stdin, stdout, stderr  =  s.exec_command( '执行的命令' )
 
查看命令的执行结果
print  stdout.read()
  • 利用公钥验证方式批量执行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
首先建立公钥和私钥文件
# ssh-keygen
     
上传本地的公钥到远程主机的.ssh / authorized_keys文件中
# ssh-copy-id -i .ssh/id_rsa.pub root@ip
     
导入模块
import  paramiko
 
实例化一个对象
=  paramiko.SSHClient()
 
自动添加策略   #首次登陆用交互式确定
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
     
建立私钥文件连接
key  =  paramiko.RSAKey.from_private_key_file( '/root/.ssh/id_rsa' )
     
通过私钥验证的方式登录远程主机
s.connect(hostname = 'ip地址' , port = 端口号, username = '用户名' , pkey = key)
     
要执行的命令
stdin, stdout, stderr  =  s.exec_command( '执行的命令' )
 
查看命令的执行结果
print  stdout.read()
  • 从远程主机上传、下载文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
导入模块
import  paramiko
 
#建立一个加密的传输管道
=  paramiko.Transport(( 'ip地址' ,端口号))
 
#建立连接
s.connect(username = '用户名' ,password = '密码' )
 
#建立一个sftp客户端对象,通过ssh transport操作远程文件
sftp  =  paramiko.SFTPClient.from_transport(s)
 
#上传本地文件到远程主机
sftp.put(localFile,remoteFile)
 
#从远程主机下载文件到本地
sftp.get(remoteFile,localFile)
 
#关闭sftp连接
s.close()


四、脚本演示

  • 局域网物理主机批量管理:执行命令

脚本还有很多瑕疵,只是作为参考练习,前提是所有主机的用户名、密码和端口号都要相同

例如:Username:root    Password:redhat     Port:22

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@python script] # cat 02_paramiko_process.py 
#!/usr/bin/env python
#coding:utf8
 
from  multiprocessing  import  Process
import  paramiko
import  sys
 
Username  =  'root'
Password  =  'redhat'
Port  =  22
 
def  runCmd(ip,cmd):
     =  paramiko.SSHClient()
     s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
     try :
         s.connect(hostname = ip, port = Port, username = Username, password = Password)
         stdin, stdout, stderr  =  s.exec_command(cmd)
         result  =   stdout.read()
     print  ip,result,
     except :
     print  '%s is not exists'  %  ip
 
def  ipProcess():
     try :
         cmd  =  sys.argv[ 1 ]
         for  in  range ( 2 , 255 ):
             ip  =  '192.168.1.%s'  %  i
         =  Process(target = runCmd,args = (ip,cmd))
             p.start()
     except  IndexError:
         print  'please input a command.'
     
if  __name__  = =  '__main__' :
     ipProcess()

执行脚本:

1
[root@python script] # python 02_paramiko_process.py uptime

截图部分返回结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
192.168 . 1.57   10 : 48 : 49  up   2 : 29 ,   0  users,  load average:  0.00 0.00 0.00
192.168 . 1.56   10 : 50 : 25  up   2 : 29 ,   0  users,  load average:  0.00 0.00 0.00
192.168 . 1.100   10 : 48 : 50  up   2 : 29 ,   0  users,  load average:  0.00 0.00 0.00
192.168 . 1.127  is  not  exists
192.168 . 1.210   22 : 48 : 51  up   2 : 28 ,   0  users,  load average:  0.00 0.00 0.00
192.168 . 1.51   10 : 48 : 52  up   2 : 28 ,   0  users,  load average:  0.00 0.00 0.00
192.168 . 1.55   10 : 50 : 26  up   2 : 29 ,   0  users,  load average:  0.00 0.00 0.00
192.168 . 1.122  is  not  exists
192.168 . 1.58  is  not  exists
192.168 . 1.52  is  not  exists
192.168 . 1.53  is  not  exists
192.168 . 1.50  is  not  exists
192.168 . 1.215   02 : 31 : 14  up   2 : 07 ,   4  users,  load average:  4.75 1.46 0.82
  • 局域网物理主机批量管理:执行上传、下载文件

这里只对批量上传做了演示,对于批量下载文件只是一行代码的更换就可以了,我也在脚本中添加了注释行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@python script] # cat 03_put_paramiko_process.py 
#!/usr/bin/env python
#coding:utf8
 
from  multiprocessing  import  Process
import  paramiko
import  sys
 
Username  =  'root'
Password  =  'redhat'
Port  =  22
 
def  sftpPut(ip):
     try :
         =  paramiko.Transport((ip,Port))
         s.connect(username = Username,password = Password)
         sftp  =  paramiko.SFTPClient.from_transport(s)
         localFile  =  '/root/sync.sh'
         remoteFile  =  '/opt/sync.sh'
         sftp.put(localFile,remoteFile)
         #sftp.get(remoteFile,localFile)
         s.close()
     print  '%s put successful.'  %  ip
     except :
     print  '%s not exists.'  %  ip
 
def  ipProcess():
     for  in  range ( 2 , 255 ):
         ip  =  '192.168.1.%s'  %  i
         =  Process(target = sftpPut,args = (ip,))
         p.start()
     
if  __name__  = =  '__main__' :
     ipProcess()

执行脚本:

1
[root@python script] # python 03_put_paramiko_process.py

截图部分返回结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
192.168 . 1.55  put successful.
192.168 . 1.181  not  exists.
192.168 . 1.198  not  exists.
192.168 . 1.200  not  exists.
192.168 . 1.207  not  exists.
192.168 . 1.209  not  exists.
192.168 . 1.57  put successful.
192.168 . 1.51  put successful.
192.168 . 1.56  put successful.
192.168 . 1.233  not  exists.
192.168 . 1.127  not  exists.
192.168 . 1.100  put successful.
192.168 . 1.210  put successful.

登陆远程主机查看文件是否上传完成:

1
2
3
4
5
6
7
8
[root@python script] # ssh 192.168.1.51
Address  192.168 . 1.51  maps to localhost, but this does  not  map  back to the address  -  POSSIBLE BREAK - IN ATTEMPT!
root@ 192.168 . 1.51 's password: 
Last login: Wed Mar  11  11 : 04 : 30  2015  from  192.168 . 1.112
[root@naginx ~] # ifconfig |grep inet |head -1
           inet addr: 192.168 . 1.51   Bcast: 192.168 . 1.255   Mask: 255.255 . 255.0
[root@naginx ~] # ll /opt/sync.sh -d
- rw - r - - r - -  1  root root  333  3 月   11  11 : 05  / opt / sync.sh     #已经成功上传文件


  • 注意:

  • 批量上传文件脚本只能满足单个文件,如何实现多个文件上传和下载呢?可以通过os模块来实现,下一篇文章中介绍如何以更人性化的方式实现参数上传下载,那就是os模块和optparse模块

多文件上传、下载请参考此文章:http://467754239.blog.51cto.com/4878013/1619323





     本文转自zys467754239 51CTO博客,原文链接:http://blog.51cto.com/467754239/1619166,如需转载请自行联系原作者





相关文章
|
2月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
403 7
|
2月前
|
JSON 算法 API
Python中的json模块:从基础到进阶的实用指南
本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
410 4
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
325 0
|
2月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
226 0
|
9月前
|
Linux 数据库 Perl
【YashanDB 知识库】如何避免 yasdb 进程被 Linux OOM Killer 杀掉
本文来自YashanDB官网,探讨Linux系统中OOM Killer对数据库服务器的影响及解决方法。当内存接近耗尽时,OOM Killer会杀死占用最多内存的进程,这可能导致数据库主进程被误杀。为避免此问题,可采取两种方法:一是在OS层面关闭OOM Killer,通过修改`/etc/sysctl.conf`文件并重启生效;二是豁免数据库进程,由数据库实例用户借助`sudo`权限调整`oom_score_adj`值。这些措施有助于保护数据库进程免受系统内存管理机制的影响。
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
428 13
|
9月前
|
Linux Shell
Linux 进程前台后台切换与作业控制
进程前台/后台切换及作业控制简介: 在 Shell 中,启动的程序默认为前台进程,会占用终端直到执行完毕。例如,执行 `./shella.sh` 时,终端会被占用。为避免不便,可将命令放到后台运行,如 `./shella.sh &`,此时终端命令行立即返回,可继续输入其他命令。 常用作业控制命令: - `fg %1`:将后台作业切换到前台。 - `Ctrl + Z`:暂停前台作业并放到后台。 - `bg %1`:让暂停的后台作业继续执行。 - `kill %1`:终止后台作业。 优先级调整:
755 5
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
509 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。

推荐镜像

更多