Python Backup Files
近来书写 Python 脚本进行替换以前的 shell 脚本,发现 Python 优于 shell 的最直观的一点Python 结构明了,可读性高(本人认为)在此做一些记录
本次记录利用 Python Script
1,SVN 备份 ,封装 paramiko的 sftp 和 ssh connection 和 ssh_exec_command
2,删除过期文件
1,SVN 备份
准备:Python Paramiko Install
方法1: 直接使用 pip 进行安装
pip install paramiko
方法2:下载源码进行安装
paramiko-1.15.2.tar.gz 主要文件
ecdsa-0.13.tar.gz 依赖文件
pycrypto-2.6.1.tar.gz 依赖文件
.install ecdsa
tar xzf ecdsa-0.13.tar.gz && cd ecdsa-0.13 && python setup.py install
.install pycrypto
tar xzf pycrypto-2.6..tar.gz && cd pycrypto-2.6. && python setup.py install
.install paramiko
tar xzf paramiko-1.15..tar.gz && cd paramiko-1.15. && python setup.py install
Python Script
#!/usr/bin/env python
# _*_coding:utf-8_*_
# author: 'lonny'
# dateTime: '15/11/16'
# motto: 'Good memory as bad written' import datetime
import os
import tarfile
import subprocess # usvn 备份--------------------------------------------------------------
class Usvn_Backend(object):
# ------------------------------------------------------------------
def __init__(self):
self.date_time = datetime.datetime.now().strftime('%Y-%m-%d-%H')
self.Root_Directory = "/software"
self.back_directory = "usvn"
self.Remote_Send_Dir = "/install/backup/usvnback" # 打包文件------------------------------------------------------------
def Package(self):
global tarfile_name
print "\033[32mWaitIng Packaging..........\033[0m"
os.chdir(self.Root_Directory)
tarfile_name = "%s-%s.tar.gz" % (self.back_directory, self.date_time)
tar = tarfile.open(tarfile_name, "w:gz")
tar.add(self.back_directory)
tar.close()
if os.path.exists(tarfile_name):
print "\033[32m..........Packaging Is SuccessFul!!!\033[32m"
else:
print "\033[32m..........Packaging Is Failed!!!\033[0m" # 执行远程命令传送文件---------------------------------------------------------
class SSHConnection(object):
"""""" # ----------------------------------------------------------------------
def __init__(self, host, username, password, port=22):
"""Initialize and setup connection"""
self.sftp = None
self.sftp_open = False # open SSH Transport stream
self.transport = paramiko.Transport((host, port)) self.transport.connect(username=username, password=password) self.session = self.transport.open_channel(kind='session') # ----------------------------------------------------------------------
def _openSFTPConnection(self):
"""
Opens an SFTP connection if not already open
"""
if not self.sftp_open:
self.sftp = paramiko.SFTPClient.from_transport(self.transport)
self.sftp_open = True # ----------------------------------------------------------------------
#下载文件时需要指定两端文件名
def get(self, remote_path, local_path=None):
"""
Copies a file from the remote host to the local host.
"""
self._openSFTPConnection()
self.sftp.get(remote_path, local_path) # ----------------------------------------------------------------------
#传送文件是需要两端都要指定文件名称
def put(self, local_path, remote_path=None):
"""
Copies a file from the local host to the remote host
"""
self._openSFTPConnection()
self.sftp.put(local_path, remote_path) # ----------------------------------------------------------------------
def run(self, command, nbytes=4096):
# Run Command out|err
stdout_data = []
stderr_data = []
self.session.exec_command(command)
while True:
if self.session.recv_ready():
stdout_data.append(self.session.recv(nbytes))
if self.session.recv_stderr_ready():
stderr_data.append(self.session.recv_stderr(nbytes))
if self.session.exit_status_ready():
break
print "\033[31m*********************\033[0m"
print '\033[32mExit status is: \033[0m', self.session.recv_exit_status()
print "\033[31m*********************\033[0m"
print ''.join(stdout_data)
print ''.join(stderr_data) def close(self):
"""
Close SFTP connection and ssh connection
"""
if self.sftp_open:
self.sftp.close()
self.sftp_open = False
self.transport.close()
self.session.close() if __name__ == '__main__':
try:
try:
import paramiko
except ImportError:
print "\033[32mInstalling Paramiko.........\033[0m"
install_paramiko = "pip install paramiko"
subprocess.call(install_paramiko, shell=True)
# Run Usvn Unpack--------------------------------------------------------------
unpack = Usvn_Backend()
unpack.Package()
# Put UsvnBack Files To Remote Server
Send_Files = SSHConnection(ipaddress, user, password)
#Set local_path Names,remote_path Names
local_path_files = "%s/%s" % (unpack.Root_Directory, tarfile_name)
remote_path_files = "%s/%s" % (unpack.Remote_Send_Dir, tarfile_name)
Send_Files.put(local_path_files, remote_path_files)
#remove tarfiles
os.chdir(unpack.Root_Directory)
os.remove(tarfile_name)
#remove end!!!!
Send_Files.close()
except KeyboardInterrupt:
print "Contorl+C+Z"
2,删除过期文件
#!/usr/bin/env python
# _*_coding:utf-8_*_
# author: 'lonny'
# dateTime: '15/12/15'
# motto: 'Good memory as bad written' import os
import sys
import time #删除文件-----------------------------------------------------------------
def remove(path):
"""
Remove the file or directory
"""
if os.path.isdir(path):
try:
os.rmdir(path)
except OSError:
print "Unable to remove folder: %s" % path
else:
try:
if os.path.exists(path):
os.remove(path)
except OSError:
print "Unable to remove file: %s" % path # 遍历输入的文件夹,查询出number_of_days天前的文件,进行删除---------------------
def cleanup(number_of_days, path):
"""
Removes files from the passed in path that are older than or equal
to the number_of_days
"""
time_in_secs = time.time() - (number_of_days * 24 * 60 * 60)
"""
计算出当前时间与number_of_days天前的毫秒差
"""
for root, dirs, files in os.walk(path, topdown=False):
for file_ in files:
full_path = os.path.join(root, file_)
stat = os.stat(full_path) if stat.st_mtime <= time_in_secs:
remove(full_path) if not os.listdir(root):
remove(root) # ----------------------------------------------------------------------
if __name__ == "__main__":
#sys.argv[1]天数 sys.argv[2]要遍历的目录
days, path = int(sys.argv[1]), sys.argv[2]
cleanup(days, path)
Python Backup Files的更多相关文章
- 贪心:SPOJ Backup Files
BACKUP - Backup Files no tags You run an IT company that backs up computer data for large offices. ...
- [PowerShell] Backup Folder and Files Across Network
## This Script is used to backup folder/files and delete the old backup files. ## Author: Stefanie # ...
- vim+python
#!/bin/bash # install fisa vim config echo '===============================' echo 'start to install ...
- zookeeper与Kafka集群搭建及python代码测试
Kafka初识 1.Kafka使用背景 在我们大量使用分布式数据库.分布式计算集群的时候,是否会遇到这样的一些问题: 我们想分析下用户行为(pageviews),以便我们设计出更好的广告位 我想对用户 ...
- python 代码混淆工具汇总
pyminifier Pyminifier is a Python code minifier, obfuscator, and compressor. Note For the latest, co ...
- Python检查 文件备份是否正常 云备份进程是否正常运行
场景:服务器自动备份数据库文件,每两小时生成一个新备份文件,通过云备份客户端自动上传,需要每天检查是否备份成功. 实现:本脚本实现检查文件是否备份成功,进程是否正常运行,并且发送相关邮件提醒. #! ...
- [python] File path and system path
1. get files in the current directory with the assum that the directory is like this: a .py |----dat ...
- TFS Express backup and restore
When we setup source control server, we should always make a backup and restore plan for it. This ar ...
- [转]Installing python 2.7 on centos 6.3. Follow this sequence exactly for centos machine only
Okay for centos 6.4 also On apu.0xdata.loc, after this install was done $ which python /usr/local/bi ...
随机推荐
- HTML-DIV布局
<DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content= ...
- HDFS Append时packet的格式以及DataNode对block/checksum文件的处理
HDFS Append时packet的格式以及DataNode对block/checksum文件的处理 HDFS的Block一般比较大,默认64MB/128MB,客户端给DataNode发数据实际上是 ...
- JS Array ECMAScript5 Methods
JavaScript 的新版本(ECMAScript 5)中,为数组新增了一些方法.这些方法包括: forEach(f [,o]): 此方法类似于for/in循环,其作用是遍历整个数组并执行函数的某些 ...
- jQuery中的动画与特效
1.显示和隐藏hide()和show() 对于动画来说,显示和隐藏是最基本的效果之一,简单介绍jQuery的显示和隐藏. <script type="text/javascript&q ...
- jquery ajax 用 data 和 headers 向 java RESTful 传递参数区别
jquery 的 ajax 是非常方便的一个函数,记录一下 $.ajax 生成的 http 报文 一.使用 data 传递参数: $.ajax({ url : "webrs/test/add ...
- 股票投资组合-前进优化方法(Walk forward optimization)
code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && docu ...
- IT外包行业与职业发展
在IT行业,总是有一些IT外包公司的存在,凡是存在的都是合理的.当你做为IT从业人员应该尽量避免去外包公司工作 .特别是你从事软件开发工作. 先来说说缘由,一些外包公司本来是从事软 ...
- 【GOF23设计模式】桥接模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_桥接模式.多层继承结构.银行日志管理.管理系统消息管理.人力资源的奖金计算 未用桥接模式: package com.te ...
- C# Sqlite 序列
sqlite 不能直接创建自定义函数,不能像 sql server中那样方便创建并使用.不过我们照样可以创建它,创建成功后,我们照样可以随心所欲(比如批量更新等) 序列是一个数据库中很常用的操作,在其 ...
- Vue条件渲染
gitHub地址:https://github.com/lily1010/vue_learn/tree/master/lesson08 一 v-if显示单个元素 注意else只能跟在v-if或者v-s ...