Python[8] :paramiko模塊多進程批量管理主機

今天和你們聊聊paramiko模塊python


1、paramiko簡介
服務器

  • paramiko是用Python語言寫的一個模塊,遵循SSH2協議,支持以加密和認證的方式,進行遠程服務器的鏈接。ssh

  • paramiko主要是經過ssh協議對遠程主機進行管理:包括執行遠程主機CLI上傳下載文件等。ide


2、快速安裝paramiko模塊this

pip的詳細安裝請參考個人另一篇文章:http://467754239.blog.51cto.com/4878013/1613612加密

# yum install python-devel
# pip install paramiko


3、paramiko命令參數詳解spa


  • 利用密碼登錄方式批量執行命令對象

導入模塊
import paramiko

實例化一個SSHClient對象
s = 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()
  • 利用公鑰驗證方式批量執行命令blog

首先創建公鑰和私鑰文件
# ssh-keygen
	
上傳本地的公鑰到遠程主機的.ssh/authorized_keys文件中
# ssh-copy-id -i .ssh/id_rsa.pub root@ip
	
導入模塊
import paramiko

實例化一個對象
s = 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()
  • 從遠程主機上傳、下載文件
    ip

導入模塊
import paramiko

#創建一個加密的傳輸管道
s = 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()


4、腳本演示

  • 局域網物理主機批量管理:執行命令

腳本還有不少瑕疵,只是做爲參考練習,前提是全部主機的用戶名、密碼和端口號都要相同

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

[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):
    s = 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 i in range(2,255):
            ip = '192.168.1.%s' % i
	    p = Process(target=runCmd,args=(ip,cmd))
            p.start()
    except IndexError:
        print 'please input a command.'
    
if __name__ == '__main__':
    ipProcess()

執行腳本:

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

截圖部分返回結果:

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
  • 局域網物理主機批量管理:執行上傳、下載文件

這裏只對批量上傳作了演示,對於批量下載文件只是一行代碼的更換就能夠了,我也在腳本中添加了註釋行。

[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:
        s = 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 i in range(2,255):
        ip = '192.168.1.%s' % i
        p = Process(target=sftpPut,args=(ip,))
        p.start()
    
if __name__ == '__main__':
    ipProcess()

執行腳本:

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

截圖部分返回結果:

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.

登錄遠程主機查看文件是否上傳完成:

[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

相關文章
相關標籤/搜索