用Python寫腳本:通過ssh在Windows下批量管理Linux


    對於超過10台以上的linux服務器,就需要考慮如何進行批量管理了。

    我了解的通常的方法有以下幾種:

    一:在linux系統下,編寫except腳本,通過ssh遠程執行命令、上傳下載文件等。

    二:使用SecureCRT的ChatWindow功能批量發送相同命令到某一批服務器。

    三:用puppy等工具管理。

    其中方法一沒什么問題,被管理服務器也不需要安裝任何特殊程序或服務,但就是需要在linux下進行操作,日常辦公PC可能大多數裝的是Windows,這樣可能要在虛擬機中進行操作,不太方便。

    方法二:僅適用於對為數不多的服務器進行少量命令操作。

    方法三:需要安裝客戶端和管理工具,配置比較麻煩但功能強大。

    本文介紹的方法,類似於方法一,但使用的是Python腳本,得益於Python跨平台性,所有操作可在Windows下進行。

    本文介紹的方法大概適合大於10台小於100台的情況,因為本文的方法僅涉及遠程執行命令,上傳、下載文件等。

    一、環境准備:

    1,安裝Python,去https://www.python.org/downloads/windows/下載Python2的最新版本,

       如:32位:https://www.python.org/ftp/python/2.7.6/python-2.7.6.msi

             64位:https://www.python.org/ftp/python/2.7.6/python-2.7.6.amd64.msi

       記得在系統-屬性-高級-環境變量-PATH中,添加Python的安裝路徑。

    2,安裝pycrypto模塊,去http://www.voidspace.org.uk/python/modules.shtml#pycrypto下載。

       如:32位:http://www.voidspace.org.uk/downloads/pycrypto26/pycrypto-2.6.win32-py2.7.exe

             64位:http://www.voidspace.org.uk/downloads/pycrypto26/pycrypto-2.6.win-amd64-py2.7.exe

    3,安裝paramiko模塊,下載地址:http://pan.baidu.com/s/1sjNNNfZ,解壓后,在DOS窗口下進入目錄,輸入

            setup.py install回車,執行安裝。

    4,打開CMD,輸入python回車,在提示符下輸入import paramiko,如果沒有錯誤提示,就說明環境已經准備好了。

    二、在遠程服務器上批量執行命令:

    1、准備服務器列表文件server_list.txt

       按“服務器IP+空格+登錄用戶名+登錄密碼”格式錄入服務器信息到serverlist.txt,如:

       192.168.1.101 root 123456

       192.168.1.102 root 123456

       ......

    2、准備要執行的命令列表文件cmd_list.txt,每行一個命令,如:

       ls -l /root

       ifconfig

       ......

    3、新建文本文件pyssh.txt,改名為pyssh.py,然后右鍵Edit with IDLE,輸入以下內容:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import paramiko
import fileinput
     
if __name__=='__main__':
    #讀取服務器列表文件
    serverlist = open("server_list.txt", "r")
         
    for line in serverlist:
        #取IP、用戶名、密碼
        ip=line.split()[0]
        username=line.split()[1]
        password=line.split()[2]
             
        #建立連接
        s=paramiko.SSHClient()
        s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        s.connect(hostname = ip,username = username, password = password)
     
        #打印分割符
        print('    Server : '+ip)
     
        #讀取命令文件
        cmdlist = open("cmd_list.txt","r")
        #執行命令
        for line in cmdlist:
            print('        '+line)
            stdin,stdout,stderr=s.exec_command(line)
            print stdout.read()
                 
        #關閉連接
        s.close()
            
    serverlist.close()

 

   4、把以上3個文件放到一個目錄,DOS到這個目錄執行pyssh.py就可以看到執行結果了。

    三、上傳文件

    1、准備好要上傳的文件,放到一個空的專用的目錄里。

    2、准備好要上傳的服務器列表Server_list.txt。

    3,編寫以下內容存為pyupload.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
    
import paramiko,datetime,os,sys,fileinput
    
if __name__=='__main__':
    #讀取服務器列表文件
    serverlist = open("server_list.txt", "r")
        
    for line in serverlist:
        #取IP、用戶名、密碼
        ip=line.split()[0]
        username=line.split()[1]
        password=line.split()[2]
            
        port=22
        #本地路徑
        l_dir='D:\\upload\\'
        #遠程路徑
        r_dir='/tmp/'
            
        #打印分割符
        print('    Server : '+ip)
    
        #建立連接
        t=paramiko.Transport((ip,int(port)))
        t.connect(username=username,password=password)
        sftp=paramiko.SFTPClient.from_transport(t)
    
        #分別上傳文件
        files=os.listdir(l_dir)
        for f in files:
            #本地路徑+文件名
            l_file=os.path.join(l_dir,f)
            #遠程路徑+文件名
            r_file=os.path.join(r_dir,f)
            print('        '+l_file+' ---> '+r_file)
            #上傳
            sftp.put(l_file,r_file)         
        t.close()     
    serverlist.close()

 

 

   3、修改上面代碼的本地路徑,把pyupload.py和server_list.txt文件放到一個目錄,DOS到這個目錄執行pyupload.py即可批量上傳文件到批量服務器。注意遠程服務器的路徑必需存在,否則會報錯。

    四、下載文件:

    1,建立一下空的專用的下載目錄download。

    2、准備好要上傳的服務器列表Server_list.txt。

    3、編寫文件file_list.txt,每行一個要下載的遠程服務器文件的完整路徑,如:/root/instll.log

    4,編寫以下內容存為pydownload.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
    
import paramiko,datetime,os,sys,fileinput
    
if __name__=='__main__':
    #讀取服務器列表文件
    serverlist = open("server_list.txt", "r")
            
    for line in serverlist:
        #取IP、用戶名、密碼
        ip=line.split()[0]
        username=line.split()[1]
        password=line.split()[2]
        port=22
    
        filelist = open("D:\\download\\file_list.txt","r")
    
        #本地路徑
        l_dir='D:\\download\\download\\'
        os.chdir(l_dir)
            
        if os.path.exists(ip) != True:
            os.mkdir(ip)
        l_dir=os.path.join(l_dir,ip)
            
        print('    Server : '+ip)
        #建立連接
        t=paramiko.Transport((ip,int(port)))
        t.connect(username=username,password=password)
        sftp=paramiko.SFTPClient.from_transport(t)
        #分別下載文件
        for r_file in filelist:
            r_file=r_file.strip('\n')
            l_file=os.path.join(l_dir,os.path.basename(r_file))
            print('        '+r_file+' ---> '+l_file)
            #下載
            sftp.get(r_file,l_file)
        t.close()
    
    serverlist.close()
    filelist.close()

 

    5、修改上面代碼的本地路徑,把pydownload.py和server_list.txt文件放到一個目錄,DOS到這個目錄執行pyupload.py即可批量下載文件到本地,且每個服務器建立一個目錄。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM