您好,登錄后才能下訂單哦!
小編給大家分享一下利用Python批量更新服務(wù)器文件的案例,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
買(mǎi)了個(gè)Linux服務(wù)器,Centos系統(tǒng),裝了個(gè)寶塔搭建了10個(gè)網(wǎng)站,比如有時(shí)候要在某個(gè)文件上加點(diǎn)代碼,就要依次去10個(gè)文件改動(dòng),雖然寶塔是可視化頁(yè)面操作,不需要用命令,但是也麻煩,雖然還有g(shù)it的hook方法,但是操作也麻煩,新建個(gè)目錄的話還得操作一次,所以萌生了一個(gè)想法,用Python來(lái)批量更新服務(wù)器上的文件
序言
在網(wǎng)上搜索了一圈,發(fā)現(xiàn)Python有個(gè)庫(kù)叫paramiko可以專(zhuān)門(mén)拿來(lái)干這個(gè)事,具體資料和安裝就網(wǎng)上去搜索吧,我就直接上代碼了,不到100行,其實(shí)還可以精簡(jiǎn)吧,后面再說(shuō)了,先把功能實(shí)現(xiàn)了再說(shuō),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('文件檢測(cè)成功,準(zhǔn)備連接服務(wù)器...') def creatConnect(): try: print('開(kāi)始連接服務(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('開(kāi)始獲取目錄...') 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('開(kāi)始上傳:' + 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('錯(cuò)誤信息:' + str(e)) continue if __name__ == "__main__": judgeFileExist() sftp,s = creatConnect() getDirectory(sftp) uploadIndex(sftp) s.close()
代碼Show完了,開(kāi)始詳細(xì)解釋一波
這個(gè)方法是檢測(cè)我當(dāng)前目錄下有沒(méi)有Index.php這個(gè)文件,如果沒(méi)有的話就直接退出不進(jìn)行下一步了,這里有個(gè)小坑,就是你Index.php這個(gè)文件名,你寫(xiě)小寫(xiě)的index.php,也能為T(mén)rue,這里有個(gè)要注意的地方,就是要修改currentIndex的值,必須在前面加上global,否則還是為空
def judgeFileExist(): global currentIndex; currentIndex = os.getcwd() + '/Index.php' if os.path.isfile(currentIndex) == False: print('Index文件不存在') exit() print('文件檢測(cè)成功,準(zhǔn)備連接服務(wù)器...')
這是連接服務(wù)器并創(chuàng)建SFTP,使用了Try來(lái)捕獲異常錯(cuò)誤
def creatConnect(): try: print('開(kāi)始連接服務(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對(duì)象來(lái)操作,sftp.chdir是用于切換目錄,相當(dāng)于shell命令的cd /www/wwwroot
sftp.listdir(path='.')是返回當(dāng)前目錄下的文件夾,且是以數(shù)組形式返回,然后將其拼接成完整路徑后再保存在本地?cái)?shù)組里備用,這里有個(gè)if in是用來(lái)跳過(guò)一些網(wǎng)站目錄,比如我xxx.demo.com這個(gè)目錄不想更新,就在開(kāi)頭的SkipArry里寫(xiě)上,用來(lái)跳過(guò)
def getDirectory(sftp): print('開(kāi)始獲取目錄...') 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形成遠(yuǎn)程服務(wù)器的文件路徑,然后使用sftp.put函數(shù)來(lái)上傳我們的文件,第一個(gè)參數(shù)是本地文件的路徑,第二個(gè)參數(shù)是遠(yuǎn)程服務(wù)器上的路徑,上傳成功后使用sftp.file來(lái)驗(yàn)證該文件是否存在,其實(shí)這里我是做了個(gè)備份處理的(有點(diǎn)bug就暫時(shí)先注釋掉了),先將原本的Index.php改名為BackIndex.php在上傳新的Index.php,這個(gè)判斷函數(shù)才有用,不然我這樣寫(xiě)沒(méi)啥用,因?yàn)樯蠜](méi)上傳成功肯定都會(huì)存在一個(gè)Index.php文件.上傳好了之后使用sftp.chmod方法來(lái)改變?cè)撐募臋?quán)限為755,這里有個(gè)坑,你直接在第二個(gè)參數(shù)寫(xiě)755,會(huì)發(fā)現(xiàn)生成的文件權(quán)限為363,經(jīng)過(guò)多次試驗(yàn)發(fā)現(xiàn),第二個(gè)參數(shù)要傳入8進(jìn)制的755,也就是493,生成的權(quán)限就是755了,感覺(jué)有點(diǎn)坑爹。
def uploadIndex(sftp): for fullpathitem in fullpathArry: remoteIndex = fullpathitem + '/Index.php' print('開(kāi)始上傳:' + 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('錯(cuò)誤信息:' + str(e)) continue
然后在main里依次執(zhí)行,就能將服務(wù)器上對(duì)應(yīng)的目錄下的文件全部替換成我本地的文件了,代碼不多,但效果好使啊,果然是人生苦短,我用Python
看完了這篇文章,相信你對(duì)“利用Python批量更新服務(wù)器文件的案例”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。