python是個(gè)很好玩的東西,?好吧我隨口說的,,反正因?yàn)楦鞣N原因(其實(shí)到底是啥我也不知道),,簡(jiǎn)單的學(xué)習(xí)了下python,然后寫了一個(gè)上傳文件上服務(wù)器的小玩具練手,。
大概功能是這樣:
1、獲取本地文件列表(包括文件夾)
2、檢查服務(wù)器上是否存在,,不存在直接上傳,存在的話,,文件夾無視,,文件比較大小,大小不一致則覆蓋,,最后檢查服務(wù)器上是否存在本地沒有的文件,,存在則刪除
3、之后增加了忽略列表,,忽略文件類型
4,、然后增加了重啟tomcat,但是這個(gè)功能未進(jìn)行測(cè)試
大概就是這個(gè)樣子,,哦了,,丟代碼丟代碼
'mandatory_update' : False, 'restart_tomcat' : False, 'ignore_file_type_list' : [] # 檢查文件夾是否存在,不存在則創(chuàng)建 stdin, stdout, stderr = ssh.exec_command('find ' + path) result = stdout.read().decode('utf-8') print('目錄 %s 不存在,,創(chuàng)建目錄' % path) ssh.exec_command('mkdir ' + path) print('%s 創(chuàng)建成功' % path) print('目錄 %s 已存在' % path) # 檢查文件是否存在,,不存在直接上傳,存在檢查大小是否一樣,,不一樣則上傳 def check_file(local_path, ssh_path): stdin, stdout, stderr = ssh.exec_command('find ' + ssh_path) result = stdout.read().decode('utf-8') sftp.put(local_path,ssh_path) print('%s 上傳成功' % (ssh_path)) lf_size = os.path.getsize(local_path) stdin, stdout, stderr = ssh.exec_command('du -b ' + ssh_path) result = stdout.read().decode('utf-8') tf_size = int(result.split('\t')[0]) print('本地文件大小為:%s,遠(yuǎn)程文件大小為:%s' % (lf_size, tf_size)) print('%s 大小與本地文件相同,,不更新' % (ssh_path)) sftp.put(local_path,ssh_path) print('%s 更新成功' % (ssh_path)) begin = datetime.datetime.now() for parent,dirnames,filenames in os.walk(config['local_path']+config['project_name']): p = os.path.join(parent,dirname) folder_list.append(p[p.find(config['project_name']):]) for filename in filenames: if config['ignore_list'].count(filename) == 0: p = os.path.join(parent,filename) file_list.append(p[p.find(config['project_name']):]) print('共有文件夾%s個(gè),,文件%s個(gè)' % (len(folder_list),len(file_list))) ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=config['hostname'], port=config['port'], username=config['username'], password=config['password']) transport = paramiko.Transport((config['hostname'],config['port'])) transport.connect(username=config['username'],password=config['password']) sftp = paramiko.SFTPClient.from_transport(transport) root_path = config['ssh_path'] + config['project_name'] stdin, stdout, stderr = ssh.exec_command('find ' + root_path) result = stdout.read().decode('utf-8') print('目錄 %s 不存在,創(chuàng)建目錄' % root_path) ssh.exec_command('mkdir ' + root_path) print('%s 創(chuàng)建成功' % root_path) print('目錄 %s 已存在,,獲取所有文件' % root_path) ssh_file_list = re.split('\n',result) target_folder_path = config['ssh_path'] + item create_folder_num = create_folder_num + check_folder(target_folder_path) if config['ignore_file_type_list'].count(os.path.splitext(item)[1]) == 0: local_file_path = config['local_path'] + item target_file_path = config['ssh_path'] + item if config['mandatory_update']: sftp.put(local_file_path,target_file_path) print('%s 強(qiáng)制更新成功' % (target_file_path)) update_file_num = update_file_num + 1 update_file_num = update_file_num + check_file(local_file_path, target_file_path) print('%s 在被忽略文件類型中,,所以被忽略' % item) for item in ssh_file_list: temp = item[item.find(config['project_name']):] if folder_list.count(temp) == 0 and file_list.count(temp) == 0 and temp != config['project_name'] and temp != '': print('%s 在本地不存在,刪除' % item) ssh.exec_command('rm -rf ' + item) delete_file_num = delete_file_num + 1 end = datetime.datetime.now() print('本次上傳結(jié)束:創(chuàng)建文件夾%s個(gè),,更新文件%s個(gè),,刪除文件%s個(gè),耗時(shí):%s' % (create_folder_num, update_file_num, delete_file_num, end-begin)) if config['restart_tomcat']: ssh.exec_command('sh ' + config['tomcat_path'] + 'shutdown.sh') ssh.exec_command('sh ' + config['tomcat_path'] + 'startup.sh')
最后加了個(gè)強(qiáng)制更新,即不管三七二十一只要不在忽略列表中直接上傳覆蓋,,畢竟通過比較大小來更新文件有概率出問題,,比如我把1改成2那么通過文件大小是無法對(duì)比出來的,如果之后有時(shí)間的話會(huì)琢磨下拉取git更新記錄或者別的方案,。
|