[英]script to sync files from local computer to external host (sftp or ssh)
For a project of me, I need to be able to copy the output of a program (HTML) to my server with a script, so it can be done by just launching the script, no further handling. 对于我的项目,我需要能够使用脚本将程序(HTML)的输出复制到服务器上,因此只需启动脚本即可完成此操作,而无需进一步处理。 The uploading should be done only for files where the content has been changed because the date is always changed after a new publish out of my program.
仅应对内容已更改的文件执行上载,因为在我的程序中进行新发布后,日期始终会更改。
I've found a script online that was able to do what I've wanted with some minor changes. 我在网上找到了一个脚本,该脚本可以进行一些小的更改就可以完成我想要的操作。 Now it works when I publish between 2 folders on my computer, but I should be able to replace my destination with an sFTP or SSH connection...
现在,当我在计算机上的2个文件夹之间发布时,它可以工作了,但我应该能够用sFTP或SSH连接替换目标位置...
import os
import filecmp
import shutil
'''
Version: Python 3.3.2
Using python SyncFolder in CMD
Origin: https://gist.github.com/aortbals/5096365
Modified by Louisdj_15
'''
class Dispatch:
''' This class represents a synchronization object '''
def __init__(self, name=''):
self.name=name
self.node_list=[]
self.file_copied_count=0
self.folder_copied_count=0
self.file_removed_count=0
self.folder_removed_count=0
def add_node(self, node):
self.node_list.append(node)
def compare_nodes(self):
''' This method takes the nodes in the node_list and compares them '''
nodeListLength = len(self.node_list)
# For each node in the list
for node in self.node_list:
# If the list has another item after it, compare them
if self.node_list.index(node) + 1 < len(self.node_list):
node2 = self.node_list[self.node_list.index(node) + 1]
'''print(str('\nComparing node ') + str(self.node_list.index(node)) + str(' and Node ') + str(self.node_list.index(node) + 1) + ':')'''
print('Comparing localhost to server')
# Pass the two root directories of the nodes to the recursive _compare_directories
self._compare_directories(node.root_path, node2.root_path)
def _compare_directories(self, left, right):
''' This method compares directories. If there is a common directory, the
algorithm must compare what is inside of the directory by calling this
recursively.
'''
comparison = filecmp.dircmp(left, right)
if comparison.common_dirs:
for d in comparison.common_dirs:
self._compare_directories(os.path.join(left, d), os.path.join(right, d))
if comparison.left_only:
self._copy(comparison.left_only, left, right)
if comparison.right_only:
self._remove(comparison.right_only, right)
left_newer = []
right_newer = []
if comparison.diff_files:
for d in comparison.diff_files:
l_modified = os.stat(os.path.join(left, d)).st_mtime
r_modified = os.stat(os.path.join(right,d)).st_mtime
if l_modified > r_modified:
left_newer.append(d)
else:
right_newer.append(d)
self._copy(left_newer, left, right)
self._copy(right_newer, right, left)
def _copy(self, file_list, src, dest):
''' This method copies a list of files from a source node to a destination node '''
for f in file_list:
srcpath = os.path.join(src, os.path.basename(f))
if os.path.isdir(srcpath):
shutil.copytree(srcpath, os.path.join(dest, os.path.basename(f)))
self.folder_copied_count = self.folder_copied_count + 1
print('Copied directory \"' + os.path.basename(srcpath) + '\" from \"' + os.path.dirname(srcpath) + '\" to \"' + dest + '\"')
else:
shutil.copy2(srcpath, dest)
self.file_copied_count = self.file_copied_count + 1
print('Copied \"' + os.path.basename(srcpath) + '\" from \"' + os.path.dirname(srcpath) + '\" to \"' + dest + '\"')
def _remove(self, file_list, src):
''' This method removes a list of files from a destionation node if doesn't exist any longer on source '''
for f in file_list:
srcpath = os.path.join(src, os.path.basename(f))
if os.path.isdir(srcpath):
shutil.rmtree(srcpath)
self.folder_removed_count = self.folder_removed_count + 1
print('Removed directory \"' + os.path.basename(srcpath) + '\" from \"' + os.path.dirname(srcpath))
else:
os.remove(srcpath)
self.file_removed_count = self.file_removed_count + 1
print('Removed file \"' + os.path.basename(srcpath) + '\" from \"' + os.path.dirname(srcpath))
class Node:
''' This class represents a node in a dispathc synchronization '''
def __init__(self, path, name=''):
self.name=name
self.root_path = os.path.abspath(path)
self.file_list = os.listdir(self.root_path)
if __name__=="__main__":
node_source = Node('C:\\source_folder', 'source')
dispatch = Dispatch('Dispatcher')
node_dest = Node('HERE I NEED AN SFTP OR SSH LINK', 'dest')
dispatch.add_node(node_source)
dispatch.add_node(node_dest)
count=0
os.system('color 2')
os.system('cls')
print('------------------------------------')
print('| DISPATCHER: |')
print('------------------------------------')
while (count < 1):
dispatch.compare_nodes()
print('')
print('Total files copied ' + str(dispatch.file_copied_count))
print('Total folders copied ' + str(dispatch.folder_copied_count))
print('Total files removed ' + str(dispatch.file_removed_count))
print('Total folders removed ' + str(dispatch.folder_removed_count))
print('')
print('Dispatcher is done! Closing connections!')
count = count + 1
You can easily sftp files with fabrics put command. 您可以使用fabrics put命令轻松地sftp文件。
from fabric.api import *
env.hosts = [<hosts>]
with cd('/tmp'):
put('/path/to/local/test.txt', 'files')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.