最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Python如何批量更新服務(wù)器文件

 更新時間:2018年07月29日 14:23:09   作者:YxYYxY  
這篇文章主要給大家介紹了關(guān)于利用Python如何批量更新服務(wù)器文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

買了個Linux服務(wù)器,Centos系統(tǒng),裝了個寶塔搭建了10個網(wǎng)站,比如有時候要在某個文件上加點代碼,就要依次去10個文件改動,雖然寶塔是可視化頁面操作,不需要用命令,但是也麻煩,雖然還有g(shù)it的hook方法,但是操作也麻煩,新建個目錄的話還得操作一次,所以萌生了一個想法,用Python來批量更新服務(wù)器上的文件

序言

在網(wǎng)上搜索了一圈,發(fā)現(xiàn)Python有個庫叫paramiko可以專門拿來干這個事,具體資料和安裝就網(wǎng)上去搜索吧,我就直接上代碼了,不到100行,其實還可以精簡吧,后面再說了,先把功能實現(xiàn)了再說,Show Code

代碼

import paramiko
import os

# 連接信息
host = 'xxx.65.9.191'
port = 22
username = 'root'
password = 'root'

# 忽略的目錄
skipArry = ['kai.xxxx.com','demo.xxxx.com']

fullpathArry = []
currentIndex = ''


# 判斷文件是否存在
def judgeFileExist():
 global currentIndex;
 currentIndex = os.getcwd() + '/Index.php'
 if os.path.isfile(currentIndex) == False:
  print('Index文件不存在')
  exit()
 print('文件檢測成功,準備連接服務(wù)器...')



def creatConnect():
 try:
  print('開始連接服務(wù)器...')
  s = paramiko.Transport((host, port))
  s.connect(username=username, password=password)
  sftp = paramiko.SFTPClient.from_transport(s)
  print('連接:' + host + '成功')
  return sftp,s
 except Exception as e:
  print('連接服務(wù)器失敗:' + str(e))



#

# 獲取目錄保存為數(shù)組
def getDirectory(sftp):
 print('開始獲取目錄...')
 sftp.chdir('/www/wwwroot')
 pathlist = sftp.listdir(path='.')
 for path in pathlist:
  fullpath = '/www/wwwroot/' + path + '/application/index/controller'
  if path in skipArry:
   continue
  fullpathArry.append(fullpath)
 print('目錄獲取完畢')

# 上傳Index文件
def uploadIndex(sftp):
 for fullpathitem in fullpathArry:
   remoteIndex = fullpathitem + '/Index.php'
   print('開始上傳:' + remoteIndex)
   try:
    sftp.put(currentIndex, remoteIndex)
    try:
     sftp.file(remoteIndex)
     sftp.chmod(remoteIndex, int("775", 8))
     print('修改' + remoteIndex + '權(quán)限為755')
     print(fullpathitem + '上傳成功')
    except:
     print(fullpathitem + '上傳失敗')
     continue
   except Exception as e:
    print('錯誤信息:' + str(e))
    continue
  

if __name__ == "__main__":
 judgeFileExist()
 sftp,s = creatConnect()
 getDirectory(sftp)
 uploadIndex(sftp)
 s.close()

代碼Show完了,開始詳細解釋一波

這個方法是檢測我當(dāng)前目錄下有沒有Index.php這個文件,如果沒有的話就直接退出不進行下一步了,這里有個小坑,就是你Index.php這個文件名,你寫小寫的index.php,也能為True,這里有個要注意的地方,就是要修改currentIndex的值,必須在前面加上global,否則還是為空

def judgeFileExist():
 global currentIndex;
 currentIndex = os.getcwd() + '/Index.php'
 if os.path.isfile(currentIndex) == False:
  print('Index文件不存在')
  exit()
 print('文件檢測成功,準備連接服務(wù)器...')

這是連接服務(wù)器并創(chuàng)建SFTP,使用了Try來捕獲異常錯誤

def creatConnect():
 try:
  print('開始連接服務(wù)器...')
  s = paramiko.Transport((host, port))
  s.connect(username=username, password=password)
  sftp = paramiko.SFTPClient.from_transport(s)
  print('連接:' + host + '成功')
  return sftp,s
 except Exception as e:
  print('連接服務(wù)器失敗:' + str(e))

這里就是執(zhí)行操作命令了,使用sftp對象來操作,sftp.chdir是用于切換目錄,相當(dāng)于shell命令的cd /www/wwwroot
sftp.listdir(path='.')是返回當(dāng)前目錄下的文件夾,且是以數(shù)組形式返回,然后將其拼接成完整路徑后再保存在本地數(shù)組里備用,這里有個if in是用來跳過一些網(wǎng)站目錄,比如我xxx.demo.com這個目錄不想更新,就在開頭的SkipArry里寫上,用來跳過

def getDirectory(sftp):
 print('開始獲取目錄...')
 sftp.chdir('/www/wwwroot')
 pathlist = sftp.listdir(path='.')
 for path in pathlist:
  fullpath = '/www/wwwroot/' + path + '/application/index/controller'
  if path in skipArry:
   continue
  fullpathArry.append(fullpath)
 print('目錄獲取完畢')

這里就是關(guān)鍵的上傳部分了,首先遍歷出我們需要修改的文件夾目錄,后面拼接上需要修改的文件Index.php形成遠程服務(wù)器的文件路徑,然后使用sftp.put函數(shù)來上傳我們的文件,第一個參數(shù)是本地文件的路徑,第二個參數(shù)是遠程服務(wù)器上的路徑,上傳成功后使用sftp.file來驗證該文件是否存在,其實這里我是做了個備份處理的(有點bug就暫時先注釋掉了),先將原本的Index.php改名為BackIndex.php在上傳新的Index.php,這個判斷函數(shù)才有用,不然我這樣寫沒啥用,因為上沒上傳成功肯定都會存在一個Index.php文件.上傳好了之后使用sftp.chmod方法來改變該文件的權(quán)限為755,這里有個坑,你直接在第二個參數(shù)寫755,會發(fā)現(xiàn)生成的文件權(quán)限為363,經(jīng)過多次試驗發(fā)現(xiàn),第二個參數(shù)要傳入8進制的755,也就是493,生成的權(quán)限就是755了,感覺有點坑爹。

def uploadIndex(sftp):
 for fullpathitem in fullpathArry:
   remoteIndex = fullpathitem + '/Index.php'
   print('開始上傳:' + remoteIndex)
   try:
    sftp.put(currentIndex, remoteIndex)
    try:
     sftp.file(remoteIndex)
     sftp.chmod(remoteIndex, int("775", 8))
     print('修改' + remoteIndex + '權(quán)限為755')
     print(fullpathitem + '上傳成功')
    except:
     print(fullpathitem + '上傳失敗')
     continue
   except Exception as e:
    print('錯誤信息:' + str(e))
    continue

然后在main里依次執(zhí)行,就能將服務(wù)器上對應(yīng)的目錄下的文件全部替換成我本地的文件了,代碼不多,但效果好使啊,果然是人生苦短,我用Python

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Python 圖片文字識別的實現(xiàn)之PaddleOCR

    Python 圖片文字識別的實現(xiàn)之PaddleOCR

    OCR方向的工程師,之前一定聽說過PaddleOCR這個項目,其主要推薦的PP-OCR算法更是被國內(nèi)外企業(yè)開發(fā)者廣泛應(yīng)用,短短半年時間,累計Star數(shù)量已超過15k,頻頻登上Github Trending和Paperswithcode 日榜月榜第一
    2021-11-11
  • numpy.transpose()實現(xiàn)數(shù)組的轉(zhuǎn)置例子

    numpy.transpose()實現(xiàn)數(shù)組的轉(zhuǎn)置例子

    今天小編就為大家分享一篇numpy.transpose()實現(xiàn)數(shù)組的轉(zhuǎn)置例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • pycharm中顯示CSS提示的知識點總結(jié)

    pycharm中顯示CSS提示的知識點總結(jié)

    在本篇文章里小編給大家整理了關(guān)于pycharm中顯示CSS提示的知識點內(nèi)容,需要的朋友們可以參考學(xué)習(xí)下。
    2019-07-07
  • Python中使用socks5設(shè)置全局代理的方法示例

    Python中使用socks5設(shè)置全局代理的方法示例

    這篇文章主要介紹了Python中使用socks5設(shè)置全局代理的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 對Python新手編程過程中如何規(guī)避一些常見問題的建議

    對Python新手編程過程中如何規(guī)避一些常見問題的建議

    這篇文章中作者對Python新手編程過程中如何規(guī)避一些常見問題給出了建議,主要著眼于初學(xué)者對于一些常用函數(shù)方法在平時的使用習(xí)慣中的問題給出建議,需要的朋友可以參考下
    2015-04-04
  • 如何利用python執(zhí)行txt文件中的代碼

    如何利用python執(zhí)行txt文件中的代碼

    這篇文章主要介紹了如何利用python執(zhí)行txt文件中的代碼,python這么強大的語言當(dāng)然可以做大,只需使用內(nèi)置的exex()函數(shù),進入主題前我們先來看看什么是exec()函數(shù),需要的小伙伴可以參考一下
    2022-03-03
  • Python操作MySQL數(shù)據(jù)庫的兩種方式實例分析【pymysql和pandas】

    Python操作MySQL數(shù)據(jù)庫的兩種方式實例分析【pymysql和pandas】

    這篇文章主要介紹了Python操作MySQL數(shù)據(jù)庫的兩種方式,結(jié)合實例形式分析了Python使用pymysql和pandas模塊進行mysql數(shù)據(jù)庫的連接、增刪改查等操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-03-03
  • 基于opencv實現(xiàn)手勢控制音量(案例詳解)

    基于opencv實現(xiàn)手勢控制音量(案例詳解)

    這篇文章主要介紹了基于opencv的手勢控制音量和ai換臉,通過定義了一個名為 handDetector 的類,用于檢測和跟蹤手部,結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • 如何通過雪花算法用Python實現(xiàn)一個簡單的發(fā)號器

    如何通過雪花算法用Python實現(xiàn)一個簡單的發(fā)號器

    這篇文章主要介紹了如何通過雪花算法用Python實現(xiàn)一個簡單的發(fā)號器,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python多進程基礎(chǔ)詳解

    python多進程基礎(chǔ)詳解

    這篇文章主要介紹了Python多進程基礎(chǔ),結(jié)合實例形式分析了Python多進程原理、開啟使用進程、進程隊列、進程池等相關(guān)概念與使用方法,需要的朋友可以參考下
    2021-10-10

最新評論

同心县| 镶黄旗| 崇信县| 南漳县| 阳谷县| 盐山县| 玉溪市| 扶绥县| 伊通| 庆阳市| 鄂温| 永康市| 邳州市| 海南省| 宜宾市| 和硕县| 濮阳市| 肥东县| 花莲县| 旌德县| 姜堰市| 泰宁县| 晋江市| 延庆县| 伊宁市| 靖安县| 西华县| 奉新县| 武邑县| 格尔木市| 沭阳县| 洛浦县| 台山市| 岱山县| 卓资县| 高唐县| 延川县| 即墨市| 光泽县| 宁陕县| 鹤山市|