利用Python如何批量更新服务器文件


Posted in Python onJuly 29, 2018

前言

买了个Linux服务器,Centos系统,装了个宝塔搭建了10个网站,比如有时候要在某个文件上加点代码,就要依次去10个文件改动,虽然宝塔是可视化页面操作,不需要用命令,但是也麻烦,虽然还有git的hook方法,但是操作也麻烦,新建个目录的话还得操作一次,所以萌生了一个想法,用Python来批量更新服务器上的文件

序言

在网上搜索了一圈,发现Python有个库叫paramiko可以专门拿来干这个事,具体资料和安装就网上去搜索吧,我就直接上代码了,不到100行,其实还可以精简吧,后面再说了,先把功能实现了再说,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('文件检测成功,准备连接服务器...')



def creatConnect():
 try:
  print('开始连接服务器...')
  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('连接服务器失败:' + str(e))



#

# 获取目录保存为数组
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 + '权限为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完了,开始详细解释一波

这个方法是检测我当前目录下有没有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('文件检测成功,准备连接服务器...')

这是连接服务器并创建SFTP,使用了Try来捕获异常错误

def creatConnect():
 try:
  print('开始连接服务器...')
  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('连接服务器失败:' + str(e))

这里就是执行操作命令了,使用sftp对象来操作,sftp.chdir是用于切换目录,相当于shell命令的cd /www/wwwroot
sftp.listdir(path='.')是返回当前目录下的文件夹,且是以数组形式返回,然后将其拼接成完整路径后再保存在本地数组里备用,这里有个if in是用来跳过一些网站目录,比如我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('目录获取完毕')

这里就是关键的上传部分了,首先遍历出我们需要修改的文件夹目录,后面拼接上需要修改的文件Index.php形成远程服务器的文件路径,然后使用sftp.put函数来上传我们的文件,第一个参数是本地文件的路径,第二个参数是远程服务器上的路径,上传成功后使用sftp.file来验证该文件是否存在,其实这里我是做了个备份处理的(有点bug就暂时先注释掉了),先将原本的Index.php改名为BackIndex.php在上传新的Index.php,这个判断函数才有用,不然我这样写没啥用,因为上没上传成功肯定都会存在一个Index.php文件.上传好了之后使用sftp.chmod方法来改变该文件的权限为755,这里有个坑,你直接在第二个参数写755,会发现生成的文件权限为363,经过多次试验发现,第二个参数要传入8进制的755,也就是493,生成的权限就是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 + '权限为755')
     print(fullpathitem + '上传成功')
    except:
     print(fullpathitem + '上传失败')
     continue
   except Exception as e:
    print('错误信息:' + str(e))
    continue

然后在main里依次执行,就能将服务器上对应的目录下的文件全部替换成我本地的文件了,代码不多,但效果好使啊,果然是人生苦短,我用Python

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python写的Socks5协议代理服务器
Aug 06 Python
总结Python中逻辑运算符的使用
May 13 Python
Python中的日期时间处理详解
Nov 17 Python
python数据清洗系列之字符串处理详解
Feb 12 Python
python3操作微信itchat实现发送图片
Feb 24 Python
对python中的logger模块全面讲解
Apr 28 Python
python 实现创建文件夹和创建日志文件的方法
Jul 07 Python
python解析命令行参数的三种方法详解
Nov 29 Python
Windows系统下pycharm中的pip换源
Feb 23 Python
如何使用python socket模块实现简单的文件下载
Sep 04 Python
如何设置PyCharm中的Python代码模版(推荐)
Nov 20 Python
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
Jun 03 Python
python高阶爬虫实战分析
Jul 29 #Python
python3.5基于TCP实现文件传输
Mar 20 #Python
python3基于TCP实现CS架构文件传输
Jul 28 #Python
python cs架构实现简单文件传输
Mar 20 #Python
Tornado Web Server框架编写简易Python服务器
Jul 28 #Python
python使用tornado实现登录和登出
Jul 28 #Python
基于python实现简单日历
Jul 28 #Python
You might like
php缓存技术介绍
2006/11/25 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
关于javascript中的parseInt使用技巧
2009/09/03 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
2013/01/23 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
2014/09/24 Javascript
node.js中的console.warn方法使用说明
2014/12/09 Javascript
JQuery中serialize() 序列化
2015/03/13 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
Windows下使Python2.x版本的解释器与3.x共存的方法
2015/10/25 Python
Python抓取手机号归属地信息示例代码
2016/11/28 Python
Python 实现链表实例代码
2017/04/07 Python
Python3学习urllib的使用方法示例
2017/11/29 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
django 2.2和mysql使用的常见问题
2019/07/18 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
Python3爬虫中关于中文分词的详解
2020/07/29 Python
Dyson加拿大官方网站:购买戴森吸尘器,风扇,冷热器及配件
2016/10/26 全球购物
PUMA官方商城:世界领先的运动品牌之一
2016/11/16 全球购物
世界上最大的字体市场:MyFonts
2020/01/10 全球购物
专家推荐信模板
2014/05/09 职场文书
小学同学聚会感言
2015/07/30 职场文书
选调生挂职锻炼工作总结
2015/10/23 职场文书
《风筝》教学反思
2016/02/23 职场文书
Python进行区间取值案例讲解
2021/08/02 Python
python利用while求100内的整数和方式
2021/11/07 Python
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫