#!usr/bin/python
# coding: utf-8
import json
import os
import sys
import time
import paramiko
import win32api
import win32con
import stat
os.chdir(os.path.dirname(os.path.abspath(__file__)))
config_filename = "config.json"
conf_key = ["remoteDir", "localDir", "host", "port", "username", "password", "checkMinSize", "proxy", "proxyIP", "proxyPort"]
downloaded = 0
print_str = ''
def write_config_file():
default_conf = '{\n' \
'"remoteDir": "/www/",\n' \
'"localDir": "./www/",\n' \
'"host": "127.0.0.1",\n' \
'"port": 22,\n' \
'"username": "root",\n' \
'"password": "root",\n' \
'"checkMinSize": 1024,\n' \
'"proxy": true,\n' \
'"proxyIP": "127.0.0.1",\n' \
'"proxyPort": 1080\n' \
'}'
f = open(config_filename, "w")
f.write(default_conf)
def progress_bar(transferred, toBeTransferred):
percents = round(100.0 * transferred / float(toBeTransferred), 1)
sys.stdout.write('%s [%s%s] %s\r' % (print_str.encode("gbk"), '%s' % percents, '%', '%.2fMB' %
(toBeTransferred / 1024 / 1024.00)))
if percents != 100:
sys.stdout.flush()
else:
class Download:
# 初始化连接
def __init__(self):
self.config = {}
self.read_config_file()
self.set_proxy()
self.scp = paramiko.Transport((self.config["host"], self.config["port"]))
self.scp.connect(username=self.config["username"], password=self.config["password"])
self.sftp = paramiko.SFTPClient.from_transport(self.scp)
self.client = paramiko.SSHClient()
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.client.connect(hostname=self.config["host"], port=self.config["port"], username=self.config["username"], password=self.config["password"])
stdin, stdout, stderr = self.client.exec_command(" find " + self.config["remoteDir"] + " -type f | wc -l")
self.file_num = int(stdout.read())
def read_config_file(self):
if os.path.isfile(config_filename):
try:
f = open(config_filename, "r")
config_ff = json.loads(f.read())
config = {}
for k in conf_key:
config[k] = config_ff[k]
self.config = config
except BaseException as e:
print e
win32api.MessageBox(0, "Config file error!", "ERROR", win32con.MB_ICONHAND)
exit()
else:
self.write_config_file()
win32api.MessageBox(0, "Config file missing. \rThe program has been created automatically.", "ERROR",
win32con.MB_ICONHAND)
exit()
def set_proxy(self):
if self.config["proxy"]:
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, self.config["proxyIP"], self.config["proxyPort"], False, '',
'')
socket.socket = socks.socksocket
def download_dir(self, localDir="", remoteDir=""):
global file_num
global print_str
global downloaded
if localDir == '':
localDir = self.config["localDir"]
if remoteDir == '':
remoteDir = self.config["remoteDir"]
localDir = localDir.rstrip("\\").rstrip("/")
remoteDir = remoteDir.rstrip("\\").rstrip("/")
if not os.path.exists(localDir):
os.makedirs(localDir)
files = self.sftp.listdir_attr(remoteDir)
for f in files:
localFile = os.path.join(localDir, f.filename)
remoteFile = remoteDir + "/" + f.filename
if stat.S_ISREG(f.st_mode):
downloaded += 1
try:
localSize = os.path.getsize(localFile)
except:
localSize = 0
if not os.path.isfile(localFile) or f.st_size != localSize:
print_str = (str(downloaded) + "/" + str(self.file_num) + " ").rjust(11) + "Download: ".rjust(12) + localFile
self.sftp.get(remoteFile, localFile, callback=progress_bar)
else:
print (str(downloaded) + "/" + str(self.file_num) + " ").rjust(11) + "Exists: ".rjust(12) + localFile
elif stat.S_ISDIR(f.st_mode):
self.download_dir(localDir=localFile, remoteDir=remoteFile)
pass
else:
pass
def download_file(self):
pass
if __name__ == "__main__":
d = Download()
print "Total files:" + str(d.file_num)
time.sleep(1)
d.download_dir()
d.scp.close()
print "Done!"
time.sleep(10)
使用pyinstaller打包成exe使用更方便